=== 1. and运算 & ===
and运算一般用于二进制的取位操做,例如一个数 and 1的结果就是取二进制的最末位。这能够用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
相同位的两个数字都为1,则为1;如有一个不为1,则为0。算法
=== 2. or运算 | ===
or运算一般用于二进制特定位上的无条件赋值,例如一个数or 1的结果就是把二进制最末位强行变成1。若是须要把二进制最末位变成0,对这个数or 1以后再减一就能够了,其实际意义就是把这个数强行变成最接近的偶数。
相同位只要一个为1即为1。数据结构
=== 3. xor运算 ^ ===
异或的符号是^。按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操做. 操做的结果是若是某位不一样则该位为1, 不然该位为0.
xor运算的逆运算是它自己,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。xor运算能够用于简单的加密,好比我想对我MM说1314520,但怕别人知道,因而双方约定拿个人生日19880516做为密钥。1314520 xor 19880516 = 20665500,我就把20665500告诉MM。MM再次计算20665500 xor 19880516的值,获得1314520。
相同位不一样则为1,相同则为0。加密
=== 4. not运算 ~ ===
not运算的定义是把内存中的0和1所有取反。使用not运算时要格外当心,你须要注意整数类型有没有符号。若是not的对象是无符号整数(不能表示负数),那么获得的值就是它与该类型上界的差,由于无符号类型的数是用00到$FFFF依次表示的。对象
=== 5. shl运算 << ===
a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。能够看出,a shl b的值实际上就是a乘以2的b次方,由于在二进制数后添一个0就至关于该数乘以2。
一般认为a shl 1比a * 2更快,由于前者是更底层一些的操做。所以程序中乘以2的操做请尽可能用左移一位来代替。
定义一些常量可能会用到shl运算。你能够方便地用1 shl 16 - 1来表示65535。不少算法和数据结构要求数据规模必须是2的幂,此时能够用shl来定义Max_N等常量。内存
=== 6. shr运算 >> ===
和shl类似,a shr b表示二进制右移b位(去掉末b位),至关于a除以2的b次方(取整)。咱们也常常用shr 1来代替div 2,好比二分查找、堆的插入操做等等。想办法用shr代替除法运算可使程序效率大大提升。最大公约数的二进制算法用除以2操做来代替慢得出奇的mod运算,效率能够提升60%。效率