移位操作

来源:互联网 发布:淘宝直邮有假货吗 编辑:程序博客网 时间:2024/04/30 03:17

1、左移(>>)

        符号位一起参加移位

对于int型,最大的移位数是31,当>=32时,对32取模然后移位;

对于long型,最大的移位数是62,当>=64时,对64取模然后移位;

        观察一段代码:

import java.util.*;public class Test{public static void main(String[] args){int i = 0;for(i= -1 ; i != 0 ; i <<= 1){System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));for(i= 1 ; i != 0 ; i <<= 1){System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}System.out.println("i=" +i+":\t"+ Integer.toBinaryString(i));}}
i=-1:   11111111111111111111111111111111i=-2:   11111111111111111111111111111110i=-4:   11111111111111111111111111111100i=-8:   11111111111111111111111111111000i=-16:  11111111111111111111111111110000i=-32:  11111111111111111111111111100000i=-64:  11111111111111111111111111000000i=-128: 11111111111111111111111110000000i=-256: 11111111111111111111111100000000i=-512: 11111111111111111111111000000000i=-1024:        11111111111111111111110000000000i=-2048:        11111111111111111111100000000000i=-4096:        11111111111111111111000000000000i=-8192:        11111111111111111110000000000000i=-16384:       11111111111111111100000000000000i=-32768:       11111111111111111000000000000000i=-65536:       11111111111111110000000000000000i=-131072:      11111111111111100000000000000000i=-262144:      11111111111111000000000000000000i=-524288:      11111111111110000000000000000000i=-1048576:     11111111111100000000000000000000i=-2097152:     11111111111000000000000000000000i=-4194304:     11111111110000000000000000000000i=-8388608:     11111111100000000000000000000000i=-16777216:    11111111000000000000000000000000i=-33554432:    11111110000000000000000000000000i=-67108864:    11111100000000000000000000000000i=-134217728:   11111000000000000000000000000000i=-268435456:   11110000000000000000000000000000i=-536870912:   11100000000000000000000000000000i=-1073741824:  11000000000000000000000000000000i=-2147483648:  10000000000000000000000000000000i=0:    0i=1:    1i=2:    10i=4:    100i=8:    1000i=16:   10000i=32:   100000i=64:   1000000i=128:  10000000i=256:  100000000i=512:  1000000000i=1024: 10000000000i=2048: 100000000000i=4096: 1000000000000i=8192: 10000000000000i=16384:        100000000000000i=32768:        1000000000000000i=65536:        10000000000000000i=131072:       100000000000000000i=262144:       1000000000000000000i=524288:       10000000000000000000i=1048576:      100000000000000000000i=2097152:      1000000000000000000000i=4194304:      10000000000000000000000i=8388608:      100000000000000000000000i=16777216:     1000000000000000000000000i=33554432:     10000000000000000000000000i=67108864:     100000000000000000000000000i=134217728:    1000000000000000000000000000i=268435456:    10000000000000000000000000000i=536870912:    100000000000000000000000000000i=1073741824:   1000000000000000000000000000000i=-2147483648:  10000000000000000000000000000000i=0:    0
2、右移(>>)

符号位不变,其他位移动

<span style="font-size:18px;">import java.util.*;public class Test{public static void main(String[] args){int k=-2147483648;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));for(int i= 1 ; i <= 32 ; i ++ ){k >>= 1;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));}}}</span>


<span style="font-size:18px;">k=-2147483648:  10000000000000000000000000000000k=-1073741824:  11000000000000000000000000000000k=-536870912:   11100000000000000000000000000000k=-268435456:   11110000000000000000000000000000k=-134217728:   11111000000000000000000000000000k=-67108864:    11111100000000000000000000000000k=-33554432:    11111110000000000000000000000000k=-16777216:    11111111000000000000000000000000k=-8388608:     11111111100000000000000000000000k=-4194304:     11111111110000000000000000000000k=-2097152:     11111111111000000000000000000000k=-1048576:     11111111111100000000000000000000k=-524288:      11111111111110000000000000000000k=-262144:      11111111111111000000000000000000k=-131072:      11111111111111100000000000000000k=-65536:       11111111111111110000000000000000k=-32768:       11111111111111111000000000000000k=-16384:       11111111111111111100000000000000k=-8192:        11111111111111111110000000000000k=-4096:        11111111111111111111000000000000k=-2048:        11111111111111111111100000000000k=-1024:        11111111111111111111110000000000k=-512: 11111111111111111111111000000000k=-256: 11111111111111111111111100000000k=-128: 11111111111111111111111110000000k=-64:  11111111111111111111111111000000k=-32:  11111111111111111111111111100000k=-16:  11111111111111111111111111110000k=-8:   11111111111111111111111111111000k=-4:   11111111111111111111111111111100k=-2:   11111111111111111111111111111110k=-1:   11111111111111111111111111111111k=-1:   11111111111111111111111111111111</span>
3、无符号右移(>>>)

高位由0补齐。

<span style="font-size:18px;">import java.util.*;public class Test{public static void main(String[] args){int k=0xFFFFFFFE;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));for(int i= 1 ; i <= 64 ; i ++ ){k >>>= 1;System.out.println("k=" +k+":\t"+ Integer.toBinaryString(k));}}}</span>
<span style="font-size:18px;">k=-2:   11111111111111111111111111111110k=2147483647:   1111111111111111111111111111111k=1073741823:   111111111111111111111111111111k=536870911:    11111111111111111111111111111k=268435455:    1111111111111111111111111111k=134217727:    111111111111111111111111111k=67108863:     11111111111111111111111111k=33554431:     1111111111111111111111111k=16777215:     111111111111111111111111k=8388607:      11111111111111111111111k=4194303:      1111111111111111111111k=2097151:      111111111111111111111k=1048575:      11111111111111111111k=524287:       1111111111111111111k=262143:       111111111111111111k=131071:       11111111111111111k=65535:        1111111111111111k=32767:        111111111111111k=16383:        11111111111111k=8191: 1111111111111k=4095: 111111111111k=2047: 11111111111k=1023: 1111111111k=511:  111111111k=255:  11111111k=127:  1111111k=63:   111111k=31:   11111k=15:   1111k=7:    111k=3:    11k=1:    1k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0k=0:    0</span>

谜题:

<span style="font-size:18px;">int i = 0;while(-1<<i != 0){i++;}System.out.println(i);</span>

最后输出什么?实际上是陷入了死循环。

因为在这里-1不可能向左移动32位(左移或右移的最大位数是31或63),所以也就不可能得到0,因此也就不可能推出循环了。

如果想要退出循环,怎么办?

<span style="font-size:18px;">int count = 0;for(int i = -1 ;i != 0 ; i <<= 1){count++;}System.out.println(count);</span>

如此可以打印出32;



0 0