java个人学习笔记:位运算符

位运算是直接对二进制进行运算的。

<<  左移 3<<2 –> 3*2*2 像左移动两位。实则*2*2

3:        0000 0011

左移两位  0000 1100

>> 右移 3>>2 –> 3/2/2 实则/2/2

3:          0000 0011

右移两位   0000 0000

有符号的右移时候,最高位是0的用0补,最高位是1的用1补。

-3 >> 2

-3         1000 0000 0000 0000 0000 0000 0000 0011 原码 1111 1111 1111 1111 1111 1111 1111 1100反码 1111 1111 1111 1111 1111 1111 1111 1101 补码

右移两位  11 1111 1111 1111 1111 1111 1111 1111  11 (01丢失)补码 1111 1111 1111 1111 1111 1111 1111 1111  1110 反码 1000 0000 0000 0000 0000 0000 0000 0001 结果为-1

 

>>> 无符号的右移运算

-3 >>> 2

-3         1000 0000 0000 0000 0000 0000 0000 0011 原码 1111 1111 1111 1111 1111 1111 1111 1100 反码 1111 1111 1111 1111 1111 1111 1111 1101 补码

右移两位  00  1111 1111 1111 1111 1111 1111 1111  11 (01丢失)结果为1073741823

注意在java中 整数默认用int存储 所以是4字节。

 

&与运算          二进制码的与运算

|或运算、        二进制码的或运算

^异或运算       二进制码的异或运算

~反码           

 

12&5

12的原码(高位为0不写)

12   0000 1100

5     0000 0101

&     0000 0100

结果  4

 

12|5

12   0000 1100

5     0000 0101

|     0000 1101

结果 13

 

12^5

12   0000 1100

5     0000 0101

^    0000 1001

结果 9

 

~12

12   0000 0000 0000 0000 0000 0000 0000 1100

~    1111 1111 1111 1111 1111 1111 1111 0011 (符号位改变 负数补码)

      1111 1111 1111 1111 1111 1111 1111 0010 (反码)

      1000 0000 0000 0000 0000 0000 0000 1101 (原码)

结果:-13

 

int m =5;

int n = 3

m = m^n;

n = m^n;

m = m^n;

 

m = m^n

n = m ^ n = (m ^ n) ^n = m =5

m = m ^n = (m ^ n) ^n = n = 3

5    0000 0101  

3    0000 0011

^   0000 0110         6

3    0000 0011

^   0000 0101         5

    原文作者:缥缈的云落寞的天
    原文地址: http://www.cnblogs.com/cyfly/p/4541546.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞