位运算
位运算
位运算是什么
位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011
在这个例子中,A和B都用二进制表示,在十进制下,a = 60,b = 13。位运算符的定义如下:
符号 | 说明 | 示例 |
---|---|---|
& | 按位与操作符,当且仅当两个操作数的某一位都非0时候结果的该位才为1。 | (A&B),得到12,即0000 1100 |
| | 按位或操作符,只要两个操作数的某一位有一个非0时候结果的该位就为1。 | (A | B)得到61,即 0011 1101 |
^ | 按位补运算符翻转操作数的每一位。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
位运算有什么用
在计算机上,位运算的效率要高于普通运算,因为计算机本身是基于二进制的。在某些特殊算法中,位运算可以提升程序效率。下面是几个应用场景的例子。
- 左移
<<
,如果是10进制向左移动一位,就成了10倍,移两位乘100倍。所以在数字没有溢出的前提下,对于正数和负数,二进制左移左移n位就相当于乘以2的n次方。 &
运算,将一个单元与0进行位与运算结果为零;判断奇偶性:用if ((a & 1) == 0) 代替 if (a % 2 == 0)来判断a是不是偶数。>>
右移,右移常被用来做 / (2 ^ n)的运算,因为直接基于二进制运算,所以右移效率比 / (2 ^ n)高。