假设我们要创建类型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
标志)