使用C ++位移内在函数创建遮罩

时间:2019-05-29 21:52:57

标签: c++ compiler-optimization bit bit-shift intrinsics

假设我们要创建类型unsigned short的掩码,并从位置len开始,创建a 1个连续的1s集,并使用尽可能少的指令。最受欢迎的方法是

T mask = ((1 << len)-1) << a;

T是任何内置的无符号整数类型。

我的问题如下:如果a != 0 && a + len < DIGITS(其中DIGITS是一个编译时间常数,等于一个类型的单词T中的位数),我们有什么可以做的(编译器内置函数或内部函数)来保存哪一条指令?我正在寻找尽可能通用的答案(与体系结构和编译器无关),但是,只有在特定系统或特定上下文中有效的答案才有用,主要是在编译时可推论的上下文中。

编辑/排行榜:

- 4条说明_bzhi_u32(-1,len) << first_pos
(但是,正如人们在评论中讨论的那样,我对_bhzi指令的延迟了解不多)

- 6条指令(只需添加-O1标志)

0 个答案:

没有答案