[研电赛技术支持] C语言位运算实用技巧

[复制链接]
859|3
 楼主| saservice 发表于 2023-9-27 23:05 | 显示全部楼层 |阅读模式
C语言位运算实用技巧
左移实现乘法

左移n位等价于乘以2的n次方

int x;
x = 2;
x = x << 2;
x = x << 3

使用左移实现乘法运算仅限于乘以2的倍数

是不是只要是左移就能够实现乘以2的倍数呢?

char x = 120;
x = x << 2;

如果执行上面的代码,最终x的值是多少呢?

右移实现除法

右移n位等价于除以2的n次方

int x = 100;
x = x >> 1;
x = x >> 3;

使用右移实现除法运算仅限于除以2的倍数

不使用中间变量交换两个整型变量的值

int a = 5, b = 6;
a = a+b;
b = a-b;
a = a-b;

以上代码看似可以实现两个整型变量数值的交换,但是你能看出其中的Bug吗?

int a = 5, b = 6;
a = a ^ b;
b = a ^ b;
a = a ^ b;

判断整数的奇偶性

x & 1

位操作进行高低位交换

a = (a >> 8) | (a << 8);

寄存器的置位

嵌入式系统总是要用户对变量或寄存器(8位)进行位操作。给定一个变量a,将a的第3个bit位置1(bit位最右边的位第0位),其他位的值不变。

a = a | 0x08

将第三个bit位清零,其他位的值保持不变

a  = a & (~0x08)

数据的“拆解”

在数据的传输过程中需要对整型数据进行拆解,例如 int x = 0x1m2345678, 我们需要将x分别拆解成0x12 0x34 0x56 0x78进行传输

x & 0xFF
(x >> 8) & 0xFF
(x >> 16) & 0xFF
(x >> 24) & 0xFF

数据的“组装”

假如我们拿到了被拆解后的数据分别为:0x12 0x34 0x56 0x78, 如果组装成0x12345678呢?

x = 0x12<<24 | 0x34<<16 | 0x56<<8 | 0x78

原文链接:https://blog.csdn.net/weixin_44218779/article/details/125001421

AloneKaven 发表于 2023-9-29 22:24 来自手机 | 显示全部楼层
这样只能算与2的乘除吗?如果是其他数可以吗
xia00 发表于 2023-10-22 10:18 | 显示全部楼层
C语言中的位运算符位运算符直接对 bit 位进行操作,其效率最高。
sourceInsight 发表于 2023-10-22 10:35 | 显示全部楼层
C语言位运算实用技巧左移实现乘法左移n位等价于乘以2的n次方int x;x = 2;x = x 3;使用右移实现除法运算仅限于除以2的倍数
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

1541

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部