gpt4 book ai didi

现代 C 编译器能否优化位访问的组合?

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:59 27 4
gpt4 key购买 nike

如果 的第 1、3、5、7、9、11、13 或 15 位之一,我希望 var 不等于 FALSE输入已设置。

一个似乎相当普遍的解决方案是:

int var = 1 & (input >>  1) ||
1 & (input >> 3) ||
1 & (input >> 5) ||
1 & (input >> 7) ||
1 & (input >> 9) ||
1 & (input >> 11) ||
1 & (input >> 13) ||
1 & (input >> 15);

但是,我担心这会导致编译器生成不必要的长代码。

以下代码也会产生所需的结果。会不会更有效率?

int var = input & 0b1010101010101010;

谢谢!

最佳答案

你的第二个例子不等价

你想要的是(使用非标准二进制文字):

int var = !!(input & 0b1010101010101010));

或者使用十六进制文字(那些是标准的):

int var = !!(input & 0xaaaa));

更改:使用十六进制常量和双重否定(相当于 != 0)。
这预先假定 input 不是 volatile,也不是原子类型。

一个好的编译器应该将两者都优化为相同的指令(大多数现代编译器都足够好)。

虽然最后,测试和测量,大多数编译器都会输出生成的汇编代码,您甚至不需要反汇编程序!

关于现代 C 编译器能否优化位访问的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24495854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com