位运算

Linux 2019-03-23

位运算

字节

1.一个int 占4个字节
2.一个char 占1个字节内存
3.一个字节由8个二进制位组成

1字节最大 对应二进制 8个111 => 最大255

运算公式

1.% 取模与 & 转换

  • 取模 和 按位与在 条件为2的平方根的时候可以互相转换
  • 因为使用按位与的效率要高很多

a % (2^n) == a & (2^n -1)

运算符

& 按位与

有0 则 0
0 & 0 = 0;

0 & 1 = 0;
1 & 1 = 1;

unsigned int temp = 38 & 22;
//进行二进制进行按位与
100110 //38
010110 // 22
------------------
000110 => 6
38 & 22 = 6;

| 按位或

有1 则 1

0 | 0 = 0;
0 | 1 = 1;
1 | 1 = 1;

unsigned int temp = 38 | 22;
//进行二进制进行按位或
100110 //38
010110 // 22
---------------
110110 => 54
38 & 22 = 6;

^ 按位异或

相同则0 不同则 1

0 ^ 0 = 0;
0 ^ 1 = 1;
1 ^ 1 = 0;

unsigned int temp = 38 ^ 22;
100110 //38
010110 // 22
---------------
110000 => 48
38 ^ 22 = 48;

~ 取反

对单个数字进行按位取反

unsigned int temp = ~38;
00000000,00000000,00000000,00100110//38
-------------------------------------------------------
1111111,11111111,11111111,11011001;//4294657357 42亿。。。。

<< 左移

将一个数的二进制位左移若干个位
每移动一个 都是乘以2

unsigned int temp = 15 << 1;//30
unsigned int temp = 15 << 2;//60

>> 右移

将一个数的二进制右移若干个位
每右移一位都相当于除以2
unsigned int temp = 15 >> 1;//7
unsigned int temp = 15 >> 2;//3
1111 15

||
v

/0111 7

位运算符结合使用

&= |= >>= <<= ^=

a &= b ===> a = a&b

案列

#define BIT(x)  (1<<(x))
int main(){
    unsigned int task;//有32个位    
    BIT(2) => 1 << 2;    
    
    
    return 0;
}

本文由 小东@xiaodo 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。