位运算

位运算针对的是二进制,所以需要将进行位运算的数现转成在内存中二进制的表示形式

 

左移或右移

例如: 3 << 2 = 12

内存中二进制(32位):   0000 0000 0000 0000 0000 0000 0000 0011
左移后的结果为(32位):   0000 0000 0000 0000 0000 0000 0000 1100

原理就是:

   左移就是从左边开始去掉几位,就在最后面添加0,补成32位

   右移同理,在前面补0还是1要看最高位(最左边)是0还是1。

计算方法: 左移:往左移几位就乘以2的几次幂  (就是乘以2的移动位数次幂)

                             3 << 2 等价 3 * 2的2次幂   3 << 3 等价 3 * 2的3次幂

                  右移: 同理往右移几位就除以2的几次幂  (除以2的移动的位数次幂)

>> : 有符号的右移  

>>>: 无符号右移无论最高位是什么,右移后,前面都补0

 

&运算:   1 & 1 = 1 、1 & 0 = 0、0 & 0 = 0 由此可以进行&运算

例如:

  6 & 3 = 2

               0000 0000 0000 0000 0000 0000 0000 0110
           &   0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
               0000 0000 0000 0000 0000 0000 0000 0010

 

|  运算 : 1 | 1 = 1 、1 | 0 = 1、0 | 0 = 0 由此可以进行 | 运算

例如:

  6 | 3 = 7

          0000 0000 0000 0000 0000 0000 0000 0110
        | 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
          0000 0000 0000 0000 0000 0000 0000 0111

 

^ 异或 :  相同为false , 不同为true     

(ps: 一个数异或同一个数两次,结果还是那个数,可以用在数据加密上)

例如:

 6 ^ 3 = 5

          0000 0000 0000 0000 0000 0000 0000 0110
        ^ 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------------------------------------
          0000 0000 0000 0000 0000 0000 0000 0101

 

~ 取反:  0和1互换,得到的结果减一再取反就得到十进制的数,然后加上负号就是结果

例如:

~6 = - 7

               0000 0000 0000 0000 0000 0000 0000 0110
取反          1111 1111 1111 1111 1111 1111 1111 1001
减一          0000 0000 0000 0000 0000 0000 0000 0001
结果          1111 1111 1111 1111 1111 1111 1111 1001
取反          0000 0000 0000 0000 0000 0000 0000 0110   = 7
加上负号最终结果是 -7

一个负数的等价于对应的正数取反加一

-6 = ~6 + 1

 

小技巧:不使用第三个变量交换两个数

int n = 3, m = 5;
//使用加法
n = n + m; //n = 8
m = n - m; //8 - 5 = 3  m = 3
n = n - m; //8 - 3 = 5  n = 5

//使用异或
n = n ^ m; 
m = n ^ m; // (n^m)^m 结果是n 此时m是n
n = n ^ m; //( n ^ m)^ n 结果是 m 

 

原文地址:https://www.cnblogs.com/gczmn/p/8196543.html