![]() |
1
41
~(~0<<m)<<n |
![]() |
2
29
那么,您要的是M集合位,前缀是K重置位,后面是N重置位?我们可以忽略k,因为它在很大程度上会受到整数类型选择的限制。
|
![]() |
3
5
我喜欢这两种解决方案。这是我想到的另一种方法(可能不会更好)。
编辑:
我以前的版本中有一个bug(它没有unsigned int cast)。问题是
是的,这种方法有一个很大的缺点:它假定您知道默认整数类型的位数,或者换句话说,它假定您确实知道k,而其他解决方案独立于k。这使得我的版本不太可移植,或者至少更难移植。(它还使用3个移位、加法和一个位求反运算符,这是两个额外的运算。) 因此,最好使用其他示例之一。 下面是一个由Jonathan Leffler完成的小测试应用程序,用于比较和验证不同解决方案的输出:
|
![]() |
4
0
虽然最上面的答案简单有效,但在以下情况下,它们不会设置最高位:
我建议使用一个32位无符号单词(它很难看,有一个分支),如下所示:
这实际上得到了范围内的位
|
![]() |
5
0
(仅适用于那些对具有bmi2支持的x86系统(Intel Haswell或更新版本、AMD挖掘机或更新版本)稍微更高效的解决方案感兴趣的用户:
这个
输出:
代码片段
比代码少一条指令
@Jonathan Leffler
和
@Darius Bacon
.
在Intel Haswell处理器或更新版本上,两者都是
|
![]() |
no one special · 32位整数缩放,无溢出 7 年前 |
![]() |
Benn Tan · 比特操作:更难翻动硬币 7 年前 |
![]() |
Ganesh Thampi · 使用位运算符将十进制转换为二进制 7 年前 |
![]() |
Ganesh Thampi · 使用位的奇偶程序 7 年前 |
![]() |
datapanda · 三维网格的莫顿反向编码 7 年前 |
![]() |
rubyquartz · 交换无符号短整数的字节 7 年前 |
|
John Proctor · C中位的掩蔽范围 7 年前 |
![]() |
Areg Sarvazyan · 从无符号int中提取位的函数 7 年前 |
|
user9505617 · 按位异或0xFFFFFFFF? 7 年前 |