我无法完成2次完成计算。
我知道C编译~b如果b = 5则将所有位反转为-6。但为什么呢?
int b = 101,反转所有位为010然后为2完成符号我只添加1但是变为011,即3这是错误答案。
我应该如何使用位反转运算符来计算??
类似的问题:如果a = 17,〜(~a)= 17怎么样?我们必须做两次完全计算。
答案 0 :(得分:7)
实际上,这里的5通常表示在内存中(16位整数):
0000 0000 0000 0101
当您反转5时,将所有位翻转为:
1111 1111 1111 1010
实际上是十进制形式的-6。我想在你的问题中,你只是简单地翻过最后三位,实际上你必须考虑构成整数的所有位。
答案 1 :(得分:6)
b = 101 (5)
的问题在于您选择的二进制数字太少了。
binary | decimal
~101 = 010 | ~5 = 2
~101 + 1 = 011 | ~5 + 1 = 3
如果选择4位,您将获得预期结果:
binary | decimal
~0101 = 1010 | ~5 = -6
~0101 + 1 = 1011 | ~5 + 1 = -5
只有3位,你可以用2的补码表示法编码从-4到+3的整数。 使用4位,您可以使用2的补码表示编码从-8到+7的整数。
-6被截断为2,-5被截断为3比特中的3。你需要至少4位。
正如其他人已经指出的那样,~
只是反转某个值中的所有位,因此,~~17
= 17
。
答案 2 :(得分:3)
~b
不是2补码操作。这是一个按位NOT操作。它只是反转一个数字中的每一位,因此~b
不等于-b
。
示例:
b = 5
binary representation of b: 0000 0000 0000 0101
binary representation of ~b: 1111 1111 1111 1010
~b = -6
b = 17
binary representation of b: 0000 0000 0001 0001
binary representation of ~b: 1111 1111 1110 1110
~b = -18
binary representation of ~(~b): 0000 0000 0001 0001
~(~b) = 17
答案 3 :(得分:3)
~
只是反转一个数字的所有位:
~(~a)=17 if a=17
~0...010001 = 1...101110 ( = -18 )
~1...101110 = 0...010001 ( = 17 )
你只需要添加1以防你想要否定一个数字(得到一个2-s补码),即从17中得到-17。
答案 4 :(得分:1)
~b + 1 = -b
所以:
~(~b)
等于~(-b - 1)
等于-(-b - 1) -1
等于b
实际上,~
会反转所有位,如果再次执行~
,它将反转。
答案 5 :(得分:1)
我无法完成2次完成计算。 我知道C编译~b如果b = 5则将所有位反转为-6。但为什么呢?
因为你正在使用两个补充。你知道两个补充是什么吗?
让我们说我们有一个字节变量(signed char)。这样的变量可以具有0到127或-128到0的值。
Binary,它的工作原理如下:
0000 0000 // 0
...
0111 1111 // 127
1000 0000 // -128
1000 0001 // -127
...
1111 1111 // -1
签名号码通常用circle来描述。
如果您了解上述内容,那么您就明白为什么~1等于-2,依此类推。
如果你使用了一个补码,那么~1将是-1,因为一个补码使用一个有符号的零。对于用一个补码描述的字节,值将从0到127到-127到-0回到0。
答案 6 :(得分:0)
你将b声明为整数。这意味着b的值将以32位存储,而补码(〜)将在32位字上发生,而不是在你正在进行的最后3位上。
int b=5 // b in binary: 0000 0000 0000 0101
~b // ~b in binary: 1111 1111 1111 1010 = -6 in decimal
最高有效位存储整数的符号(1:negetive 0:positive),因此1111 1111 1111 1010是十进制的-6。 同样:
b=17 // 17 in binary 0000 0000 0001 0001
~b // = 1111 1111 1110 1110 = -18