计算机基础之位移运算

1.前言

二进制整数最终都是以补码的形式呈现的。正数的最高位是0,负数的最高位是1。正数的原码,补码,反码都一样。负数的反码为原码取反,补码为反码加1。位移运算有两种,一种是带符号位移运算一种是不带符号位移运算。

2.带符号位移运算(<< 与 >>)

带符号位移运算分为<<(左移)与>>(右移)。这两种位移,都是针对补码运算,符号位均参与位移运算,右移除负数往高位补1之外,其余位置都补0,而左移不管是正数还是负数,空位都补0,所以左移过程中,负数有可能变成正数,正数有可能会变成负数,自己体会一下。不分正负:针对偶数一般右移一位就是除2,左移一位是乘2,针对奇数,右移一位就是除2-1,减一因为多余一位被直接抹除了,左移一位也是乘2。请看以下示例:

  • 35
    原码:00100011              ~~~~~~~~~~~~             >>1(补码右移一位):00010001=17(2的0次方+2的4次方)
    补码:00100011              ~~~~~~~~~~~~             <<1(补码左移一位):01000110=70
    反码:00100011

  • -35(负数)
    负数比较特殊,这里来特殊说明一下:
    (1)首先说明原码:
    35的原码我们知道是00100011,所以-35的原码是10100011(最高位是符号位,负数的符号位是1,其余位跟正数是一样的)。
    (2)再说反码:
    负数的反码是负数的原码取反,所以-35的反码为11011100(高位仍然不变,负数一直是1,其他取反)。
    (3)再说补码:
    负数的补码是反码加一,所以-35的补码是11011101。所以:

“>>1”(补码右移一位)=11101110(负数右移,高位补1),转成原码=10010010(补码减一,然后取反)= -18

“<<1”(补码左移一位)=10111010,转成原码= 11000110= -70

2.不带符号位移运算,只有右移运算(>>>),不存在左移运算。

不带符号位的位移运算,即没有把最高位当成是一个符号位,正常移动计算。不论正数还是负数,空位都补0。正数无符号右移的最小值是0,负数无符号右移的最小值是1。如果位移的位数=类型本身的位数(整形int是32位,长整形long是64位),那么就还是值本身,所以针对Int类型的负数的最小值是右移31位时得到的1。请看以下示例:

35
补码:00100011
无符号右移一位:00010001=17
无符号右移两位:00001000=8
无符号右移三位:00000100=4

-35
补码:11011101
无符号右移一位:01101110=110
无符号右移两位:00110111=55
无符号右移三位:00011011=27

最后,喜欢动手的可以自己多找几个数运行一下试试,这样能加强记忆。附上转二进制的调用方法:

String m = Integer.toBinaryString(-35<<1);
String n = Integer.toBinaryString(-35>>1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值