大家工作中对位操作的使用是什么态度

2019-07-30 18:31:50 +08:00
 lihongjie0209

有些时候确实挺方便的, 但是不那么"直观"(对于团队中的其他人)

大家的看法是什么

7437 次点击
所在节点    程序员
76 条回复
wangyaominde
2019-07-31 11:38:11 +08:00
之前写嵌入式,还是位操作好用,如果为了维护,还是要尽量写好注释
pmispig
2019-07-31 11:52:37 +08:00
嵌入式一般都是位操作,节省内存和流量带宽
karllynn
2019-07-31 11:55:16 +08:00
单片机写过没,老铁
jaskle
2019-07-31 12:10:31 +08:00
@iwtbauh emmmm,其实你可以连续定义 2 个 uchar 然后断点,用&拿出地址,看看是不是 4 字节对齐
iwtbauh
2019-07-31 12:52:13 +08:00
@jaskle #64

编译器:
gcc (Debian 8.3.0-6) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.

源码:
#include <stdio.h>

int main()
{
unsigned char a;
unsigned char b;

unsigned short c;
unsigned short d;

unsigned long e;

printf("%p, %p\n", &a, &b);
printf("%p, %p\n", &c, &d);
printf("%p\n", &e);

return 0;
}

构建目标:x86_64-pc-linux-gnu
构建指令:gcc -fno-pie -no-pie -Wall -O3 test.c

运行:
./a.out
0x7ffc780f27d2, 0x7ffc780f27d3
0x7ffc780f27d4, 0x7ffc780f27d6
0x7ffc780f27d8

uchar 没有对齐
ushort 按 2 字节对其
ulong 按 8 字节对其
RayeGong
2019-07-31 13:48:00 +08:00
@invoke 真理 后期需求修改 review 的时候简直觉得自己脑积水
imycc
2019-07-31 13:57:44 +08:00
可以写,但是你得在位运算上面留一段注释说明意图跟原理。这也适用于其他为了让程序更高效而逻辑不直观的地方。
shawndev
2019-07-31 16:13:30 +08:00
Clean Code 一书最受启发的一点:不要把抽象层级不同的代码放在一起。

比如 IO 操作和报文校验。正则表达式和 rpc 调用。

基于这个共识,位操作能用就用。
toma77
2019-07-31 16:23:14 +08:00
写权限系统的时候用位运算比较好
jaskle
2019-07-31 17:46:46 +08:00
@iwtbauh 我刚刚试了一下 win 下也确实没有对齐,只有单片机是 4 对齐的,估计还是与 cup 指令集有关系。
如果申请> 1 字节数组的话会强制对齐 4 字节。
感谢。
xxdd
2019-07-31 18:10:57 +08:00
项目中没必要 维护成本远远大于省下的性能成本。
Bown
2019-07-31 19:15:27 +08:00
BLE 开发必备,传输速度太慢了,不自定义二进制协议用户没法用
spadger
2019-07-31 19:58:47 +08:00
位域了解下。
ShawyerPeng
2019-07-31 22:04:24 +08:00
判断某个状态是否存在的场景使用位运算不是挺常见的吗,比如订单状态的枚举值分别有:1-已取消(OrderStatusEnum.Canceled),2-已下单,4-待处理,8-已支付,16-待出行,32-已成交。新增订单某个状态位的时候,只需要进行异或运算 orderStatus |= OrderStatusEnum.XXX ;删除某个状态位时只需要 orderStatus ^= OrderStatusEnum.XXX ;判断是否存在某个状态时,只需要用(orderStatus & OrderStatusEnum.XXX) ==0 判断即可。
metrxqin
2019-07-31 23:49:00 +08:00
对 2^N 求模:x & (2^N - 1)
乘或者整除 2^N:X < N 或者 X > N
如果数值集合为{0, 2, 4, N } n = 2^x, x=1, 2, 3...
则可以使用一个字节表达 256 种数值,假设这些数值被表示用于分配堆内存大小( Buddy Allocator) 这只需要一个字节 X 便足以表达任意大小(最大不超过 2^255)(代表 2 的幂),执行 2 < X 还原真实空间大小。

这样看来还有有点用处的。
nodwang
2019-08-01 10:48:24 +08:00
@iwtbauh 实践是检验真理的唯一标准,看这个贴子让我有一种做过山车的感觉, 哦学到了->额,不对->哦学到了->诶,还不对,实践出真知,感谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587613

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX