计算机中存储的都是二进制,最高位表示符号位,0为正数,1为负数。在计算机中其实没有原码反码,存储的二进制全都是补码。而存储为补码的原因就是为了简便计算(可以把减法变为加法来计算)。原码和反码是我们在求补码时的抽象。
正数的原码,反码,补码都是原码本身,三者的结果是一样的;
负数的反码是在原码的基础上,符号位不变,其余的按位取反;补码是反码+1。
所以我们使用java输出一个负数的二进制时,其实是这个数的补码,不是原码。比如-10:
-10的原码是:1000 0000 0000 0000 0000 0000 0000 1010
使用java将-10转为二进制打出来其实是-10的补码:

关于左移<<,右移>>,无符号右移>>>运算符:
左移:将一个整数转换成二进制,将二进制的每一位各左移动。规律:假设移动n位,变量是x,公式:x<<n=x*2^n;
右移:>>(有符号),当数值为负数时,在右移时的第一位符号位不参与移动。
规律:假设移动n位,变量是x。
如果是正数,公式:x>>n=x/2^n;(取整)
如果是负数,若x/2^n没有余数,
公式:x>>n=x/2^n;
若x/2^n有余数,
公式:x>>n=x/2^n-1;(取整之后减1)
无符号右移:>>>(无符号),当数值为负数时,在右移时的第一位符号位参与移动。
按位与(&) 按位或(|) 按位异或(^) 按位取反(~)
按位与运算:将两个数字转换成二进制,每一位进行与运算。只有当相应位上的数都是1时,该位才取1,否则该为为0。
按位或运算:将两个数字转换成二进制,每一位进行或运算。只要相应位上存在1,那么该位就取1,均不为1,即为0。
按位异或: 将两个数字转换成二进制,每一位进行异或。相应位上相同为0,相异为1。
按位取反: 将两个数字转换成二进制,每一位进行取反。每个位上都取相反值,1变成0,0变成1。
异或运算规律:一个数异或同一个数两次,结果还是这个数。利用这个结论可以不用第三方变量交换两个数的值:
交换a,b的值:
a=a^b;
b=a^b;
a=a^b;
计算机中的二进制
最新推荐文章于 2023-03-10 13:01:24 发布