整数取反编程_【每日编程185期】数字的补数
发布日期:2021-06-24 11:10:50 浏览次数:3 分类:技术文章

本文共 1925 字,大约阅读时间需要 6 分钟。

每日编程中遇到任何疑问、意见、建议请公众号留言或直接撩Q474356284(备注每日编程)

今日问题:

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。

注意:

  1. 给定的整数保证在32位带符号整数的范围内。

  2. 你可以假定二进制数不包含前导零位。

示例 1:

输入: 5

输出: 2

解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

示例 2:

输入: 1

输出: 0

解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。


解决方法:

首先说一下:

这里的补数“不是“之前你学过的补码哦。

虽然在计算机科学中补码的概念是来源于数学中的补数的。

需要注意的一点是本题求正整数的原码的时候需要忽略前导零位。

什么意思呢?

举个栗子:比如5,二进制是101,那么它的补数就是010,十进制就是2.

但是!但是!但是!计算机不是这样想的!

按照int来计算的话,int是多少位的?(下面这段话选看)

(在不同编译器中,可能不一样,比如在32位和64位编译器下,int都是4个字节,也就是32位。(你也许又会问32位和64位为什么都是4个字节,回答是:这是规定啊!需要说明一下的是指针类型存储的是所指向变量的地址,所以32位机器只需要32bit,而64位机器需要64bit。)

那么,int占用4个字节,32位。

5的二进制就是1000,0000,0000,0000,0000,0000,0000,0101.

则它的反码就是0111, 1111, 1111,1111, 1111, 1111, 1111,1010.

显然,将其直接取反,再输出为十进制就不符合题意了。

算法思想(一):

① 寻找一个掩码(mask)

要找的这个掩码的特征应该是这个样子的。5的二进制是101,只占3个bit,那么这个掩码的最后3个bit要是0,其余全部是1。如下所示:

5:0000 0101

掩码:1111 1000

② 分别取反

~5 :1111 1010

~掩码:0000 0111

③ 相与

~5 & ~掩码 = 0000 0010

算法思想二:

return      pow(2,int(log2(num))+1) - 1 -num;

//图片代码中以注释的方式写出。

Java算法思想(三):

return      ~num & (Integer.highestOneBit(num) - 1);

以上各个符号的作用:

①Integer.highestOneBit(num):取num的二进制数最左边的最高位,且高位后面全部补零,最后返回int型的结果。

②-1:因为经过上面的步骤,只有最高位为1其余位都为0这样再减一就会导致借位直到借到最高位,结果得到 最高位为0其余位都为1相当于取反了

③&:对两个二进制数进行按位与运算,例101& 010得000;

101&111得101。                                        

④~ :对一个数的二进制取反

C++代码:

a15758da88464071806c27430123166e.png

C代码:

bbb8ae398c668461a22045f824ebb02f.png

Java代码:

27f8d6b8b64812a68c9cd79a8d72e146.png


明日题目预告:

唯一摩尔斯密码词

国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。

为了方便,所有26个英文字母对应摩尔斯密码表如下:

[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]

给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-.-....-",(即"-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。

返回我们可以获得所有词不同单词翻译的数量。

例如:

输入: words =["gin", "zen", "gig", "msg"]

输出: 2

解释:

各单词翻译如下:

"gin"-> "--...-."

"zen"-> "--...-."

"gig"-> "--...--."

"msg"-> "--...--."

共有 2 种不同翻译, "--...-." 和 "--...--.".

注意:

  • 单词列表words 的长度不会超过 100。

  • 每个单词 words[i]的长度范围为 [1, 12]。

  • 每个单词 words[i]只包含小写字母。

36c85442a8e4f4a66226d30cbe228a5a.png

9c268ecddad8baaf1bc04ac46f7bc3b8.png

2fbd5b9886841f6dbccb75eb540a0c63.png

8579a4c1972f1e0752a4c6c102ded17a.png

转载地址:https://blog.csdn.net/weixin_32421193/article/details/112587671 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:能用别的软件吗_手机软件能用蓝牙传送吗
下一篇:realme x2 深度测试打不开_搭载65W超级闪充,realme真我X7手机充电评测

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月26日 01时34分08秒