V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
liuidetmks
V2EX  ›  程序员

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

  •  
  •   liuidetmks · 2023-04-19 17:01:16 +08:00 · 3056 次点击
    这是一个创建于 613 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. 编译器会优化?
    2. cpu 看来最终耗时是等价的?

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

    默认的 Int64 这样有用吗

    20 条回复    2023-04-20 09:32:24 +08:00
    Nazz
        1
    Nazz  
       2023-04-19 17:03:47 +08:00
    有没有必要得看你做什么, 业务层没必要
    ysc3839
        2
    ysc3839  
       2023-04-19 17:05:01 +08:00 via Android
    没有必要,会优化,除非编译时只能使用 Debug 模式
    xtreme1
        3
    xtreme1  
       2023-04-19 17:11:31 +08:00
    unsigned 才是
    Hurriance
        4
    Hurriance  
       2023-04-19 17:11:54 +08:00
    取决你的需求。

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

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

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

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

    我的建议是,如果你的逻辑真的是取模那就用%,如果是 BitMask 这样的操作就用&,按它本来的语义来。
    secondwtq
        16
    secondwtq  
       2023-04-19 19:32:09 +08:00
    对于这个 case 来说,现代 C/C++/Fortran 编译器对于整数的 div/mod 操作,当除数是整数时是可以直接优化掉的
    https://godbolt.org/z/Eo8T56hn5
    myqoo
        17
    myqoo  
       2023-04-19 19:37:45 +08:00
    js 里有必要
    oldshensheep
        18
    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
        19
    yanqiyu  
       2023-04-19 21:08:23 +08:00   ❤️ 1
    > 默认的 Int64 这样有用吗
    会有,因为这两个表达式在 x<0 的时候不等价,编译器不能动手脚
    但是 uint 带优化的话编译出来是一样的
    yolee599
        20
    yolee599  
       2023-04-20 09:32:24 +08:00
    可以这么写,要可读性加注释不就行了,说明等价于什么,使用条件是什么
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5479 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:59 · PVG 14:59 · LAX 22:59 · JFK 01:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.