打印
[研电赛技术支持]

C语言位运算实用技巧

[复制链接]
638|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

主题

1278

帖子

2

粉丝