美文网首页JAVA&python学习之路
位运算:负数右移与无符号右移运算小结

位运算:负数右移与无符号右移运算小结

作者: 梦小琪 | 来源:发表于2019-03-28 10:00 被阅读0次

    该作者讲述的很详细。

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

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

           举例1:

                       -100带符号右移4位。-100二进制转换为:1100100

                       -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即可。

    ---------------------

    作者:等你看完风景

    来源:CSDN

    原文:https://blog.csdn.net/king_msky/article/details/17221973

    相关文章

      网友评论

        本文标题:位运算:负数右移与无符号右移运算小结

        本文链接:https://www.haomeiwen.com/subject/fbmfbqtx.html