前言
常用的二进制位运算技巧,本文适用于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) |
1 条评论
作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。