位运算

原码  反码  补码

注意的规则:

01.整数的三个码都是一致的,不需要转换

02.负数必须转换成补码才能运算

03.计算机真正参与运算的是  补码

04.在java中所有的数字嗾使有符号的     符号位 0==》 整数  1==》负数

05.符号位就是最高位也是最左边的一位

06.负数的反码=符号位不变+其他位取反(1变0  0变1)

07.负数的补码=反码+1

3 - 2 =1  写出过程

1.先找出3的补码  因为3是正数,补码和原码一致

0 0 0 0   0 0 0 0   0 0 0 0   0 0 1 1  ==》3的补码

2.找到-2的补码  先找到-2的源码

    1 0 0 0   0 0 0 0   0 0 0 0   0 0 1 0  ==》 -2的源码  不能参与运算 需要转换成 反码
    1 1 1 1   1 1 1 1   1 1 1 1   1 1 0 1  ==》 -2的反码 也不能参与运算 需要转换成补码
    1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 0  ==》 -2的补码  参与运算了
+   0 0 0 0   0 0 0 0   0 0 0 0   0 0 1 1  ==》 3的补码
===================================================================
    0 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1 
===================================================================
 1*2的0次方        ===》位置数字*进制的下标次方                            

算数的右移和算数的左移

算数的右移 >>:

01.符号位不变

02.低位溢出删除

03.高位补零!

10 >> 1   10的2进制数字  右移一位 

>>:位移的方向
1 :位移的位数


首先找到10的2进制

      0 0 0 0   0 0 0 0   0 0 0 0   1 0 1 0      ====》10的2进制
>>1     0 0 0   0 0 0 0   0 0 0 0   0 1 0 1 0    ====》右移1位的结果
==================================================================
      0 0 0 0   0 0 0 0   0 0 0 0   0 1 0 1      ==》5


-1 >> 1
首先找到-1的2进制
       1 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1    ==>-1的2进制  原码
       1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 0    ==>-1的2进制  反码
       1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 1    ==>-1的2进制  补码      
>> 1     1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 1
================================================================
       1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 1    ===》-1的补码
       1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 0    ===》-1的反码
       1 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1    ===》原码  -1   

算术左移   <<:

01.符号位不变

02.高位溢出删除

03.低位补零

1 << 4

            0 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1     ===》1的补码
  0 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1 
========================================================================
            0 0 0 0   0 0 0 0   0 0 0 1   0 0 0 0     ==>结果16

逻辑右移,没有逻辑左移    >>>:

01.不管符号位

02.低位溢出删除

03.高位补零

-1 >>> 1   -1逻辑右移1位

      1 0 0 0   0 0 0 0   0 0 0 0   0 0 0 1     ===》-1的原码
      1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 0     ===》-1的反码
      1 1 1 1   1 1 1 1   1 1 1 1   1 1 1 1     ===》-1的补码
>>> 1============================================================      
      0 1 1 1   1 1 1 1   1 1 1 1   1 1 1 1     ===》-1的逻辑右移1位
      
2147483647  int类型的最大值

位运算 :  &    |    ^    ~

01. & 按位与  :两位都是1,结果是1

 3&4 
  
    0 0 0 0   0 0 0 0   0 0 0 0   0 0 1 1 
&   0 0 0 0   0 0 0 0   0 0 0 0   0 1 0 0 
===========================================
    0 0 0 0   0 0 0 0   0 0 0 0   0 0 0 0 

02.| 按位或 :两位有一位是1,结果是1

  3|4
  
    0 0 0 0   0 0 0 0   0 0 0 0   0 0 1 1 
|   0 0 0 0   0 0 0 0   0 0 0 0   0 1 0 0 
===========================================
    0 0 0 0   0 0 0 0   0 0 0 0   0 1 1 1 

03.^ 按位异或 :两位必须一个为0,一个为1,结果才是1

 3^4
  
    0 0 0 0   0 0 0 0   0 0 0 0   0 0 1 1 
^   0 0 0 0   0 0 0 0   0 0 0 0   0 1 0 0 
===========================================
    0 0 0 0   0 0 0 0   0 0 0 0   0 1 1 1 

04.~ 按位取反,只能是一个表达式

        按位取反结果等于该数的相反数减1

       ~3  ====》-4(-3-1=-4)

原文地址:https://www.cnblogs.com/liutianci/p/8125388.html