前言

常用的二进制位运算技巧,本文适用于C语言。

运算符

  • 逻辑运算符
    &&  -  逻辑与
    ||  -  逻辑或
    !   -  逻辑非

    逻辑运算符的运算结果只有true(1)false(0)2种。

运算逻辑

运算逻辑:

//逻辑或
true  && true   //true
true  && false  //false
false && false  //false
//逻辑与
true  || true   //true
true  || false  //true
false || false  //false
//逻辑非
!true   //false
!false  //true

  • 位运算符
    &  -  与
    |  -  或
    ^  -  异或
    ~  -  取反
    << -  左移
    >> -  右移

    位运算符的运算结果是一个数字。

运算逻辑

运算逻辑:
以下均为二进制,省略0b前缀

//与
1111 & 1100  //1100
0000 & 1100  //0000
0101 & 1010  //0000
//或
1111 | 1100  //1111
0000 | 1100  //1100
0101 | 1010  //1111
//异或 (不一样的位为1,一样的位为0)
1111 ^ 1100  //0011
0000 ^ 1100  //1100
0101 ^ 1010  //1111
//取反
~1111  //0000
~0000  //1111
~0101  //1010
//左移 (相当于*2)
1111 << 1  //1110
0000 << 1  //0000
0101 << 1  //1010
//右移 (相当于/2)
1111 >> 1  //0111
0000 >> 1  //0000
0101 >> 1  //0010

整数的二进制编码方式

在现代计算机大都采用补码的方式储存数字。
数字的常用编码方式:

表示范围:[-127 ~ +127]
编码方式:正数不变,负数符号位置1

数值 二进制
2 0000 0010
1 0000 0001
0 0000 0000
-1 1000 0001
-2 1000 0010

表示范围:[-127 ~ +127]
编码方式:正数不变,负数为正数按位取反

数值 二进制
2 0000 0010
1 0000 0001
0 0000 0000
0 1111 1111
-1 1111 1110
-2 111 1101

表示范围:[-128 ~ +127]
编码方式:正数不变,负数为反码+1 (消除0的重码)

数值 二进制
2 0000 0010
1 0000 0001
0 0000 0000
-1 1111 1111
-2 1111 1110

常用二进制技巧

功能 公式
判断奇偶 y = x & 1(奇数为1)
取第n y = x & (1<<n)
将第n位置为 1 y = x | (1<<n)
将第n为置为 0 y = x & ~(1<<n)
将第n位的值取反 y = x ^ (1<<n)
最后修改:2020 年 03 月 26 日
Null