x % 256 有必要写成 x & 255 吗

2023-04-19 17:01:16 +08:00
 liuidetmks
  1. 编译器会优化?
  2. cpu 看来最终耗时是等价的?

我知道有些算法会避免使用乘法,除法,尽量采取无脑移位,例如二进制扩展欧几里得算法。但是这是针对大数的

默认的 Int64 这样有用吗

3031 次点击
所在节点    程序员
20 条回复
Nazz
2023-04-19 17:03:47 +08:00
有没有必要得看你做什么, 业务层没必要
ysc3839
2023-04-19 17:05:01 +08:00
没有必要,会优化,除非编译时只能使用 Debug 模式
xtreme1
2023-04-19 17:11:31 +08:00
unsigned 才是
Hurriance
2023-04-19 17:11:54 +08:00
取决你的需求。

除非你有很明确性能方面的要求,并且后者的优化确确实实给应用带来影响,那自然可以采取。

在我很有限的经历里,代码的可读性,在一个项目的足够长的周期里,反而是价值最大的。
PythonYXY
2023-04-19 17:20:06 +08:00
除了优点炫技的感觉,工作中这样写完全没有必要
needpp
2023-04-19 17:30:33 +08:00
方便给人读的代码才是好代码; 运行效率那是编译器干的事
wu67
2023-04-19 17:31:22 +08:00
容易读懂, 一眼筛过去不需要动脑子, 才是最重要的. debug 的时候, 表达式越反人类直觉, 耗时就越长...

我现在前端项目里面一堆以前人留下来的坑, 各种隐式转换和用+号转字符串为数字, 看着脑壳疼
cssk
2023-04-19 17:32:06 +08:00
PC 没必要,MCU 看情况
KousukeSakurako
2023-04-19 17:34:53 +08:00
为何不写成 `x & 255 // equivalent to 'x % 256'` 可读性和那可能有可能没有的性能优化都有了。 当然前提是真的等价, 你还可以继续注释 `assert x > 0`。

根据我个人几年算法竞赛的经验, 这种性能优化是有意义的, 不过很少有那种场景就是了
apake
2023-04-19 17:36:16 +08:00
没必要, 可读性更重要. 节省人的时间更重要
bruce0
2023-04-19 17:45:36 +08:00
以前在 V 站看到过一句话 "可读性>性能>编译时间"
AoEiuV020CN
2023-04-19 18:28:09 +08:00
我应该会写成 x & 0xff ,
这不是典型的取最低字节的写法吗,我没有在其他操作遇到过需要%256 的情况,
seers
2023-04-19 18:41:12 +08:00
会被同事打死
leonshaw
2023-04-19 19:22:34 +08:00
要是无符号类型
agagega
2023-04-19 19:29:54 +08:00
浮点数可以手工优化一下,因为浮点数限制很多,编译器没有额外选项的情况下一些优化没法做。整数操作编译器能优化到你完全认不出。

我的建议是,如果你的逻辑真的是取模那就用%,如果是 BitMask 这样的操作就用&,按它本来的语义来。
secondwtq
2023-04-19 19:32:09 +08:00
对于这个 case 来说,现代 C/C++/Fortran 编译器对于整数的 div/mod 操作,当除数是整数时是可以直接优化掉的
https://godbolt.org/z/Eo8T56hn5
myqoo
2023-04-19 19:37:45 +08:00
js 里有必要
oldshensheep
2023-04-19 19:50:33 +08:00
有可能不用:
int a(unsigned n) { return n % 256; }

int b(int n) { return n & 255; }

函数 a 和 b 是等价的,汇编代码完全相同 https://godbolt.org/z/Mod7GGPKj
yanqiyu
2023-04-19 21:08:23 +08:00
> 默认的 Int64 这样有用吗
会有,因为这两个表达式在 x<0 的时候不等价,编译器不能动手脚
但是 uint 带优化的话编译出来是一样的
yolee599
2023-04-20 09:32:24 +08:00
可以这么写,要可读性加注释不就行了,说明等价于什么,使用条件是什么

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

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

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

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

© 2021 V2EX