位运算
百度百科如下:
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作
位操作的优势
- 位运算是一种底层的运算,往往比我们普通的运算要快上许多许多
- 位运算是最高效而且占用内存最少的算法操作,执行效率非常高
- 位运算操作的是二进制数,会拥有一些二进制的特性,在实际问题可以方便运用
- 位运算只需较低的空间需求
- 位运算使用能使程序变得更加简洁和优美
- 位运算可以表示一些状态集合
运算符号
下面的a和b都是整数类型,则:
含义 | C语言 |
---|---|
按位与 | a & b |
按位或 | a | b |
按位异或 | a ^ b |
按位取反 | ~a |
左移 | a << b |
带符号右移 | a >> b |
无符号右移 |
优先级
C语言中位运算符之间,按优先级顺序排列为
优先级 | 符号 |
---|---|
1 | ~ |
2 | <> |
3 | & |
4 | ^ |
5 | | |
6 | &=、^=、|=、<<=、>>= |
概念简介以及技巧
本文会以C语言的交互环境来做代码演示
常见的二进制位的变换操作
and运算 &
- 判断奇偶数
对于除0以外的任意数x,使用x&1==1作为逻辑判断即可
if (x&1==1)
{
}
- 判断某个二进制位是否为1
比如第7位, 0x40转到二进制是0100 0000,代表第7位是1.
if (n&0x40)
{
//TODO:添加你要处理的代码
}
- 字节读取
(x >> 0) & 0x000000ff /* 获取第0个字节 */
(x >> 8) & 0x000000ff /* 获取第1个字节 */
(x >> 16) & 0x000000ff /* 获取第2个字节 */
(x >> 24) & 0x000000ff /* 获取第3个字节 */