一、前置知识
1、二进制中的原码、反码、补码的生成规则:(以100为例)
原码: 0000 0000 0110 0100
反码:1111 1111 1001 1011
求反规则补码:1111 1111 1001 1100 = 1111 1111 1001 1011(反码)+ 1
二进制加法规则(逢二进一)注意:在计算机中,负数以其正值的补码形式表达,方法为其绝对值求反加一;
2、二进制中,如果是有符号的表示,则第一个位为符号位,0表示正数,1表示负数。
二、按位移动操作符:
<< 左移
>> 有符号右移
>>> 无符号右移
按位移动操作符有两个操作数:一个是被移动的数字,一个要移动的长度。移动的方向根据操作符的不同而不同;
按位移动操作符会先将操作数转换位二进制32位的整数,并返回与左操作数相同类型的结果。右操作数应小于32位,否则只有最低5个字节会被使用;
注意:以下提到的操作数是指被移动的数字整体,不是其中的某一位数
1、左移(<<)
该操作符会将第一个操作数向左移动指定的位数,左侧移出的被丢弃,右侧用0填充;
eg:9 << 2
9转换位二进制:0000 0000 0000 0000 0000 0000 0000 1001
向左移动2位: 0000 0000 0000 0000 0000 0000 0010 0100
转换为10进制: 36
总结:在数字 x 上左移 y 比特得到 x * 2y
2、有符号的右移(>>)
该操作符会将第一个操作数向右移动指定的位数,右侧移出的被丢弃,左侧拷贝之前左侧的位来填充。由于新的最左侧位和以前的相同,符号位没有边,所以被称作为符号传播。
eg: 9 >> 2
9转换为二进制:0000 0000 0000 0000 0000 0000 0000 1001
向右移动2位: 0000 0000 0000 0000 0000 0000 0000 0010
转换为10进制:2
eg: -9 >> 2
-9 转换为二进制: 1111 1111 1111 1111 1111 1111 1111 0111
绝对值二进制:0000 0000 0000 0000 0000 0000 0000 1001
取反码: 1111 1111 1111 1111 1111 1111 1111 0110
取补码: 1111 1111 1111 1111 1111 1111 1111 0111
向右移动2为: 1111 1111 1111 1111 1111 1111 1111 1101
转换为10进制: -3
取反码(减1):1111 1111 1111 1111 1111 1111 1111 1100
取原码: 0000 0000 0000 0000 0000 0000 0000 0011
3、无符号的右移(>>>)
该操作符将第一个操作数向右移动指定的位数,右侧移出的被丢弃,左侧用0填充。因为符号为变成了0,所以总是非负的,即使移动0个比特,结果也是非负的;
对于非负数,有符号的右移和无符号的右移返回的结果是相同的;
eg:9 >>> 2
9转换为二进制: 0000 0000 0000 0000 0000 0000 0000 1001
向右移动2位: 0000 0000 0000 0000 0000 0000 0000 0010
转换为十进制: 2
eg: -9 >>> 2
-9 转换为二进制: 1111 1111 1111 1111 1111 1111 1111 0111
绝对值二进制:0000 0000 0000 0000 0000 0000 0000 1001
取反码: 1111 1111 1111 1111 1111 1111 1111 0110
取补码: 1111 1111 1111 1111 1111 1111 1111 0111
向右移动2位: 0011 1111 1111 1111 1111 1111 1111 1101
转换为十进制: 1073741821
网友评论