在嵌入式C语言中,使用位操作程序有很好的可读性。以下就简单介绍以下常用的位操作。
常见的二进制位的变换操作
功能 | 示例 | 位运算 |
去掉最后一位 | (101101-->10110) | x>>1 |
在最后加一个0 | (101101-->1011010) | x<<1 |
在最后加一个1 | (101101-->1011011) | (x<<1)+1 或 (x<<1)|1 |
把最后一位变成1 | (101100-->101101) | x|1 |
把最后一位变成0 | (101101-->101100) | x|1-1 |
最后一位取反 | (101101-->101100) | x^1 |
从右数第K位变成1 | (101001-->101101,K=3) | x|(1<<(K-1)) |
从右数第K位变成0 | (101101-->101001,K=3) | x&(~(1<<(K-1))) |
从右数第K位取反 | (101001-->101101,K=3) | x^(1<<(K-1) |
取末三位 | (101101-->101) | x&7 |
取末K位 | (101101-->1101,K=4) | x&15 |
取右数第K位 | (1101101-->1,K=4) | (x>>(K-1))&1 |
把末K位变成1 | (101001-->101111,K=4) |
x|(1< |
把末K位取反 | (101001-->100110,K=4) |
x^(1< |
把右边连续的1变成0 | (100101111->100100000) | x&(x+1) |
把右起第一个0变成1 | (100101111->100111111) | x|(x+1) |
把右边连续的0变成1 | (11011000->11011111) | x|(x-1) |
取右边连续的1 | (11011111->11111) | (x^(x+1))>>1 |
去掉右起第一个1的左边 | (100101000->1000) | x&(-x) |
判断第7位是否为1 | if(x&0x40){……} | |
字节读取 | (x>>0)&0x000000FF | 获取第0个字节 |
字节读取 | (x>>8)&0x000000FF | 获取第1个字节 |
字节读取 | (x>>16)&0x000000FF | 获取第2个字节 |
判断奇偶数 | if(x&1==1){……} | |
判断两个数是否异号 |
int x = -1, y = 2; bool f = ((x ^ y) < 0); // true int x = 3, y = 2; bool f = ((x ^ y) < 0); // false |
|
求2的n次方 |
1<
|
|
高低位交换 |
unsigned short a = 34520; a = (a >> 8) | (a << 8); |
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !