@[TOC](目录)
位运算概述
位运算就是基于整数的二进制表示进行的运算,由于计算机内部就是以二进制来村塾数据,位运算是相当快的。基本的位运算共6种,分别为按位与、按位或、按位异或、按位取反、左移和右移
与、或、异或
这三者都是两数间的运算,因此这里就放在一起了
注意:1 :这里要区分逻辑与和 按位与逻辑或 和按位或的区别。
2:异或运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变 例如a^b^b = a
相关例子:
5 = 101(二进制) 6 = (110)
5&6 = 100 (二进制)= 4
5|6 = 111(二进制) = 7
5^6 = 011(二进制) = 3
取反
取反是对一个数n进行的位运算,即单目运算
取反暂无默认的数学符号表示,其对应的运算符为 ~。它的作用是把 的二进制补码中的 和 全部取反( 变为 , 变为 )。有符号整数的符号位在 ~ 运算中同样会取反。
注意:补码:在二进制表示下,整数和0的补码为其本身,负数的补码是将其对应正数按位取反后加一
例子:
5=(000000101)二进制
-5=(11111010)二进制
-5的补码=(11111011)二进制
~(-5)=(00000100)二进制 = 4
左移和右移
n<< i 表示将n的二进制向左移动i位所得的值
n>>i 表示将n的二进制向右移动i位所得的值
11= (00001011)二进制
11 << 3 = (01011000)二进制 = 88
11 >> 2 =(00000010)二进制 = 2
注意:移位运算中如果有操作数为负值或右操作数大于等于左操作的位数,这些行为都是未定义的
例如:a<< -1 ,a>>32