美文网首页
二进制带符号/无符号位移运算

二进制带符号/无符号位移运算

作者: i娟儿 | 来源:发表于2021-05-20 15:38 被阅读0次

    1. 带符号位移运算

    正数/负数 向左移 << 1位 向右移 >> 1位
    正数(35的补码 00100011) 01000110 = 70 00010001 = 17
    负数(-35的补码 11011101) 10111010 = -70 11101110 = -18
    正数(99的补码 01100011) 11000110 = -58 00110001 = 49
    负数(-99的补码 10011101) 00111010 =58 11001110 = -50

    左移运算由于符号位参与向左移动,移动后的结果,最左位可能是0或者1,
    即,正数向左移动的结果可能是正,也可能是负;
    负数向左移动的结果可能是正,也可能是负。

    1. 无符号位移运算

    正数/负数 向右移 >>> 1位 向右移 >>> 2位 向右移 >>> 3位
    正数(35的补码 00100011) 00010001 = 17 00001000 = 8 00000100 = 4
    负数(-35的补码 11011101) 01101110 = 110 00110111 = 55 00011011 = 27

    对于3个大于号的>>>无符号向右移动(注意不存在无符号向左移动的运算方式),当向右移动时,正负数高位均补0,正数不断向右移动的最小值是0,而负数不断向右移动的最小值是1。

    无符号意即藐视符号位,符号位失去特权,必须像其他平常的数字位一起向右移动,高位直接补0,根本不关心是正数还是负数。此运算常用在高位转低位的场景中。

    为何负数不断地无符号向右移动的最小值是1呢?在实际编程中,位移运算仅作用于整数(32位)和长整型(64位)数上,假如在整型数上移动的位数是32位,无论是否带符号位以及移动方向,均为本身。因为移动的位数是一个mod32的结果,即35>>1与35>>33是一样的结果。假如长整型,mod64, 即35<<1与35<<65的结果是一样的。负数在无符号往右移动63位时,除了最右边为1外,左边均为0,达到最小值1,如果>>>64, 则为其原数值本身。


    理解整理来源于:阿里巴巴Java码出高效

    相关文章

      网友评论

          本文标题:二进制带符号/无符号位移运算

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