位运算&原码 反码 补码 移码 (干货)

& 按位与:  &为双目运算符。按位与的运算法则:如果2个整型数据a、b对应位数都是1,则结果才是1,否则为0。

|  按位或:   | 为双目运算符。按位或的运算法则:如果2个整型数据a、b对应位数都是0,则结果才是0,否则为1。

~ 按位取反:  ~ 为单目运算符。按位取反,也称为按位非。按位非的运算法则:对应位数为0,修改为1;对应位数为1,修改为0。 

^ 按位异或: ^ 为双目运算符。按位异或的运算法则:当两个操作数的二进制表示相同(同时为0或同时为1)时,结果为0,否则为1。

<< 左移:乘以2的N次幂,幂为左移的位数。位数向左移,右边移空的部分补0。

>> 右移:除以2的N次幂,幂为右移的位数。位数向右移,左边移空的部分,最高位为1,则补1;最高位为0,则补0。

>>> 无符号右移:除以2的N次幂,幂为右移的位数。位数向右移,左边移空的部分,最高位补0。

>> 与 >>> 的区别,向右移动后,左边移空的部分,>>> 只补0,>> 根据最高位数值,补入相同的值。

反码:符号位保留不变,数值为按位取反。符号位为第一位,0为正数,1为负数。

重要总结:(非常重要)

① 第一小结

正整数的原码、反码和补码都一样;

负数部分:

原码和反码的相互转换:符号位不变,数值位按位取反

原码和补码的相互转换:符号位不变,数值位按位取反,末位再加1

已知补码,求原码的负数的补码:符号位和数值位都取反,末位再加1

② 第二小结

在计算机中,负数的二进制以原码的补码形式表达。

原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。 

例如4的二进制原码为:00000000 00000000 00000000 00000100

-4的二进制原码为:  10000000 00000000 00000000 00000100

-4的二进制为原码的补码:11111111 11111111 11111111 11111100

③ 第三小结

无论是正数还是负数,左移、右移、无符号右移,都是先获取原码的补码,然后进行位移,位移后的结果转换为原码。

④ 第四总结  (Java转换)

数值 --> 二进制 : Integer.toBinaryString(数值); 

二进制 --> 数值 : 0b + 32位的二进制 例如1的二进制转换为数值1: 0b00000000000000000000000000000001

 

posted @ 2019-02-26 15:40  bobwuming  阅读(346)  评论(0)    收藏  举报