关于负数的右移>>与无符号右移>>>运算小结

      对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:

        对于负数的右移:因为负数在内存中是以补码形式存在的,所有首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移位完成以后,然后保持符号位不变,其余按位取反加1,得到移位后所对应数的原码。即为所求。

       举例1:

                   -100带符号右移4位。

                   -100原码:   10000000    00000000    00000000   01100100

                   -100补码:    保证符号位不变,其余位置取反加1

                                         11111111    11111111    11111111   10011100

                   右移4位   :   在高位补1

                                         11111111    11111111    11111111    11111001

                                 补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是我们所求的结果。其方法如下:

                    保留符号位,然后按位取反

                                         10000000    00000000    00000000     00000110

                    然后加1,即为所求数的原码:

                                                   10000000    00000000    00000000    00000111

                         所有结果为:-7

                  举例2:

                            -100无符号右移4位。

                   -100原码:   10000000    00000000    00000000   01100100

                   -100补码:    保证符号位不变,其余位置取反加1

                                         11111111    11111111    11111111   10011100

                   无符号右移4位   :   在高位补0

                                         00001111    11111111    11111111    11111001

                  即为所求:268435449

                 

 

总结:正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。 负数的右移,就是补码高位补1,然后按位取反加1即可。

===============================================================================

首先左移和右移的区别是很好区分的

左移<< :就是该数对应二进制码整体左移,左边超出的部分舍弃,右边补零。举个例子:253的二进制码1111 1101,在经过运算253<<2后得到1111 0100。很简单

右移>> :该数对应的二进制码整体右移,左边的用原有标志位补充,右边超出的部分舍弃。

无符号右移>>> :不管正负标志位为0还是1,将该数的二进制码整体右移,左边部分总是以0填充,右边部分舍弃。

举例对比:

-5用二进制表示1111 1011 ,红色为该数标志位

-5>>2: 1111 1011————–>1111 1110

11为标志位

-5>>>2:  1111 1011————–>0011 1110

00为补充的0

转载:http://blog.csdn.net/cobbwho/article/details/54907203

      对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:

        对于负数的右移:因为负数在内存中是以补码形式存在的,所有首先根据负数的原码求出负数的补码(符号位不变,其余位按照原码取反加1),然后保证符号位不变,其余位向右移动到X位,在移动的过程中,高位补1.等移位完成以后,然后保持符号位不变,其余按位取反加1,得到移位后所对应数的原码。即为所求。

       举例1:

                   -100带符号右移4位。

                   -100原码:   10000000    00000000    00000000   01100100

                   -100补码:    保证符号位不变,其余位置取反加1

                                         11111111    11111111    11111111   10011100

                   右移4位   :   在高位补1

                                         11111111    11111111    11111111    11111001

                                 补码形式的移位完成后,结果不是移位后的结果,要根据补码写出原码才是我们所求的结果。其方法如下:

                    保留符号位,然后按位取反

                                         10000000    00000000    00000000     00000110

                    然后加1,即为所求数的原码:

                                                   10000000    00000000    00000000    00000111

                         所有结果为:-7

                  举例2:

                            -100无符号右移4位。

                   -100原码:   10000000    00000000    00000000   01100100

                   -100补码:    保证符号位不变,其余位置取反加1

                                         11111111    11111111    11111111   10011100

                   无符号右移4位   :   在高位补0

                                         00001111    11111111    11111111    11111001

                  即为所求:268435449

                 

 

总结:正数的左移与右移,负数的无符号右移,就是相应的补码移位所得,在高位补0即可。 负数的右移,就是补码高位补1,然后按位取反加1即可。

===============================================================================

首先左移和右移的区别是很好区分的

左移<< :就是该数对应二进制码整体左移,左边超出的部分舍弃,右边补零。举个例子:253的二进制码1111 1101,在经过运算253<<2后得到1111 0100。很简单

右移>> :该数对应的二进制码整体右移,左边的用原有标志位补充,右边超出的部分舍弃。

无符号右移>>> :不管正负标志位为0还是1,将该数的二进制码整体右移,左边部分总是以0填充,右边部分舍弃。

举例对比:

-5用二进制表示1111 1011 ,红色为该数标志位

-5>>2: 1111 1011————–>1111 1110

11为标志位

-5>>>2:  1111 1011————–>0011 1110

00为补充的0

转载:http://blog.csdn.net/cobbwho/article/details/54907203

猜你喜欢

转载自blog.csdn.net/qq_23892379/article/details/79507732
今日推荐