JAVA按位取反运算

按位取反是对补码进行运算,当运算完后,再将补码变回原码。
这个符号为按位取反运算符。按位取反的运算规则为0变成1,1变成0. [0->1,1->0]
有这么一个题:1.求~9的结果是什么
解:9的二进制数表示 0000 1001
9的原码 0000 1001
9的反码 0000 1001
9的补码 0000 1001
按位取反操作 1111 0110
变为原码先减一 1111 0101
再取反 1000 1010 (-10)

2.求~-9的结果
-9的二进制数表示 1000 1001
-9的原码 1000 1001
-9的反码 1111 0110
-9的补码 1111 0111
按位取反操作 0000 1000
变为原码 0000 1000 (8) 因为正数的补码、反码、原码都是一个样。

假如9的类型是char型,char类型占一个字节,一个字节等于八位二进制数,所以它的数据宽度为八位二进制数(0000 0000)。最高位,也就是最左边的0为符号位:0表示正数,1表示负数。
9用二进制数存储在内存中为:0000 1001 (原码)这就是原码
而9为正数,它的原码、反码、补码都是同一个,都是 0000 1001
按位取反时,需要对所有的二进制数取反。 按位取反后变成 1111 0110 此时的二进制数为补码,而且是负数(因为最高位为1,表示为负数),就需要将其变为原码,补码变为原码,怎么变呢,首先先减1,此时变为 1111 0101,然后再变为原码(变为原码时,符号位不变)1000 1010(原码),此时的原码就是这个,它就是-10.所以~9=-10.

猜你喜欢

转载自blog.csdn.net/mx0418/article/details/82894579