前言

常用的二进制位运算技巧,本文适用于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 日
如果觉得我的文章对你有用,请随意赞赏