位运算复习

基础知识

二进制中最高位为符号位。
例如一个字节的1
原码=反码=补码 0·000 0001
一个字节的-1
原码 1000 0001
反码(除符号位外1变为0 0变为1) 1111 1110
补码(反码加1) 1111 1111

计算机的计算是以二进制的补码来进行运算的
十进制转r进制 除r取余直到商为0 余数倒序排列。
r进制转十进制 二进制 10011 转十进制 1乘2的0次方+1乘2的1次方+0乘2的2次方…
n进制转k进制 先转为10进制再转为k进制

(&)按位与

两个数里的位相同则保持不变,相反则为0,简单来说,就是除了两个位为1的时候保持为1,其它情况都为0。
例如 1111 0000 & 0100 1110 = 0100 0000

(|)按位或

两个数里的位只要有一个为1则为1,其余为0。
例如 1111 0000 | 0100 1110 = 1111 1110

(^)按位异或

两个数里的位不相同为1,其余为0。
1111 0000 ^ 0100 1110 = 1011 1110

(~)按位取反

1变成0,0变成1
例如 ~ 1111 0000 = 0000 1111

(<<)左移

丢弃最高位低位补0
如 1000 0001 << 1 =0000 00010
超过最高位取模移动
数学意义 左移n位相当于该数乘2的n次方

(>>)右移

符号位不变 高位补符号位,丢弃最低位
1000 0001 >> 1 =1100 0000
数学意义 左移n位相当于该数除以2的n次方

(>>>)无符号右移

高位补0,丢弃最低位

常用姿势

设标志位

1
2
3
4
5
6
7
8
9
int a =0x01;
int b =0x02;
int c =0x08;
int state =a | c;
判断是否有a
可以a& state ==a 来判断
去除c 状态 可以用 state &= ~c;