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

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

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

大家的看法是什么

7246 次点击
所在节点    程序员
76 条回复
winterfell30
2019-07-30 19:42:51 +08:00
@jaskle 求教,char 不能省空间吗
orzorzorzorz
2019-07-30 19:44:18 +08:00
最多用简单的运算,比如 ~~ 之类的
littlewing
2019-07-30 19:45:42 +08:00
@winterfell30 如果你这个 char 在 struct 里的话,因为字节对其的原因,很可能对齐到 4 字节上去了
GeruzoniAnsasu
2019-07-30 19:46:20 +08:00
难到你们写的东西都不需要

status = STAT_A | STAT_B ?
liuxey
2019-07-30 19:46:54 +08:00
除了底层软件,操作系统,数据库,驱动等,应用层用位操作就是作死
coolair
2019-07-30 20:06:37 +08:00
铁定不用啊,过一天自己都看不明白是啥意思。
jaskle
2019-07-30 20:22:54 +08:00
@winterfell30
目前 cpu 单周期最小 32 位,所以为了提高存取效率单个 uchar 会占用 4 个字节,也就是 int 大小。当然可以使用紧缩型编译,但会导致一个 uchar 会先读取整合相邻 4 字节,然后通过移位拿出属于他的 1 字节 uchar。所以读取周期会是 2 个,写入就更麻烦了……
这也就是我们常说的 4 字节对齐,非 4 字节对齐会极大耗费 cpu,一般来讲编译器将所有变量的起始地址都对齐 4 字节,这么来讲一个 uchar 和 int 内存开销是一致的,但 uchar 运算开销倍增!
Raymon111111
2019-07-30 20:28:48 +08:00
...

没什么必要就别用了

又优化不了多少性能
winterfell30
2019-07-30 20:42:31 +08:00
@jaskle 好的多谢,目前项目中有一个对内存要求很高的地方就是用 char 存的 int 类型,然后用 pack(1)的方法强制了 1 个字节对齐,CPU 这块还没有评估
xuanbg
2019-07-30 20:45:57 +08:00
多种状态复合判断的时候,位操作挺好使的。
rayhy
2019-07-30 21:16:53 +08:00
用位操作算 flag 不是蛮常用的吗?
summer20100514
2019-07-30 21:42:42 +08:00
果然 v 站都是纯程序员不搞嵌入式
gamexg
2019-07-30 21:51:40 +08:00
@GeruzoniAnsasu #24 +1
状态、错误代码不用位运算?
另外实现二进制协议也需要位运算。
Takamine
2019-07-30 22:16:21 +08:00
什么,你说 hashmap,hash 一致性算法用位运算?好,我知道了,那就直接取个模。:doge:
kaminic
2019-07-30 22:20:09 +08:00
大小端转换
颜色值顺序转换 比如 rgba 转 abgr
用位操作简单快速
所以还是看需求吧,位操作不是洪水猛兽
ysn2233
2019-07-30 22:51:46 +08:00
>>这种还是经常用的
OhYee
2019-07-30 23:02:33 +08:00
我觉得我就是你们要喷的用位运算的。
可是用位运算真的解决了很多后期的问题,而且我封装好并且写了注释

个人认为该用的话还是有必要用的,可读性可以靠注释和封装来弥补。
AlvaIM
2019-07-30 23:08:50 +08:00
现在的年轻人怎么啦,基础的东西学不会还则罢了, 居然学不会还喷。
socradi
2019-07-30 23:38:50 +08:00
位运算在某些地方还是蛮方便的,比如读二进制文件。可以不用位运算的地方就尽量不用,可读性不太好。
iwtbauh
2019-07-30 23:39:11 +08:00
@jaskle #3

那你可能需要看看<<迷失的 C 结构打包艺术>>: https://github.com/ludx/The-Lost-Art-of-C-Structure-Packing/blob/master/README.md

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

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

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

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

© 2021 V2EX