位运算

Posted 弓长张&木子李

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算相关的知识,希望对你有一定的参考价值。

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

 

左移或右移

例如: 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 

 

以上是关于位运算的主要内容,如果未能解决你的问题,请参考以下文章

编程思想:巧用位运算重构代码

基础位运算基本原理和应用

位运算相关

优雅代码05-从hashMap源码介绍位运算符

c语言位运算问题?

为啥 JSHint 反对位运算符?我应该如何表达这个代码?