基础知识
1.与&
两位全为1,结果才为1,否则为0
特殊用法:
(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中指定位 例:设X =10101110,取X的低4位,用X&00001111 = 0000 1110 即可得到
2.或 |
只要有一个为1,结果就为1
特殊用法:
常用来对一个数据的某些位置赋1
3.异或^
两个相应位为值不同为1,相同为0
特殊用法:
(1)使特定位翻转 找一个数,对应X要翻转的各位,该数的对应位为1,其余位为0,此数与X对应位异或即可
例:设X =10101110,使X低4位翻转,用X^00001111 = 1010 0001 即可得到
(2)与0相异或,保留原值;与1相异或,取反
(3)两个变量交换值的方法
a、借助第三个变量来实现 C=A; A=B; B=C
b、利用加减法实现两个变量的交换 A=A+B;B=A-B;A=A-B
c、用位异或运算来实现两个变量交换值 效率最高 A=A^B;B=A^B;A=A^B
4.非~ 取反
补码
32位无符号整数 unsigned int
32位有符号整数 int
1.最高位为符号位,1负,0非负
2补码 对于最高位为0的编码C,直接看作32位二进制数S
定义该编码按位取反后得到的~C表示的数值为-1-S
3.反码 按位取反 反码加1称为补码
4.发生算数溢出时相当于自动对2^32取模
5.0x3f3f3f3f ①2倍不超过int能表示的最大正整数 ②每八位(每个字节)都相同
memset(a,0x3f,sizeof(a))可以给数组赋0x3f3f3f3f
移位
1.左移
将一个运算对象的各二进制位全部左移若干位(高位越界后舍弃,右边补0)
1<<n=2^n n<<1=2n
2.算术右移
将一个数的各二进制位全部右移若干位,高位以符号位填充,低位越界后舍弃
操作数每右移一位,相当于该数除以2向下取整
二进制状态压缩
1.取出n在二进制表示下的第k位 (n>>k)&1
2.取出n在二进制表示下的第0~k-1位(后k位) n&((1<<k)-1)
3.把n在二进制表示下的第k位取反 n^(1<<k)
4.对n在二进制表示下的第k位赋1 n | (1<<k)
5.对n在二进制表示下的第k位赋0 n&(~(1<<k))
成对变换
对于非负整数n:
当n为奇数时,x^1=n-1
当n为偶数时,x^1=n+1
用于邻接表中边集的存储
lowbit运算
lowbit(n)取出非负整数n在二进制表示下最低位的1以及它后边的0构成的数值
lowbit(n)=n & (-n+1) =n&(-n)
用于hash找出所有是1的位,也是树状数组中的一个基本运算