https://blog.csdn.net/qq_39736982/article/details/82897647.net
一、正数,三码(源码、反码、补码)相同,因此不管左移仍是右移都是补0.(左移则表示放大2的N次方,右移表示缩小2的N次方)blog
二、负数的补码就须要注意,左移在右边补0,右移须要在左边补1get
有一个颇有趣的误区是,认为符号位保持不变,仅仅移动数据位,这是不对的,由于不管数据位仍是符号位,都是二进制,在总体大迁移的过程当中,符号位也是要跟随潮流的。只不过,为了保证右移后,和原来的符号数同样,所以,负数在右移时左边补源码
计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负基础
首先写出4的二进制数,由于是正数因此最高位为0,也就是第一个二进制
0000 0100qq
右移两位获得(高位补0)数据
0000 0001计算机
结果为:1,右移n位也就是4/(2^n)移动
首先写出-4的二进制数源码,由于是负数因此最高位为1 (负数的源码是负数的绝对值)
1000 0100
而后写出-4反码:保证符号位不变,其他位置取反
1111 1011(反码)
最后写出-4的补码:在反码的基础上加1
1111 1100(补码)
右移2位: 在高位补1
1111 1111
根据补码写出原码才是咱们所求的结果, 保留符号位,而后减1取反 (或按位取反再加上1)
1111 1110(减1的结果)
1000 0001(取反的结果)
结果为:-1
正数:例如4>>>2
与4>>2的运算相同,结果也为1
负数:例如-4>>>2
首先写出-4的二进制数,由于是负数因此最高位为1
1000 0100
而后写出-4补码:保证符号位不变,其他位置取反加1(从右往左遇到第一个1,而后剩下的所有取反就是了)
1111 1100(补码)
右移2位: 在高位补0
0011 1111
结果为:63