- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个相对众所周知的技巧可以取消设置最右侧的单个位:
y = x & (x - 1) // 0b001011100 & 0b001011011 = 0b001011000 :)
我发现自己有一个紧密的循环来清除最右边的 n 位,但是有没有更简单的代数技巧?
// x = 0b001011100 n=2
for (auto i=0; i<n; i++) x &= x - 1;
// x = 0b001010000
我已经翻了几次我的 TAOCP Vol4a,但找不到任何灵感。
最佳答案
对于具有 BMI2 的 Intel x86 CPU, pext
和 pdep
很快。 AMD 具有非常慢的微编码 PEXT/PDEP ( https://uops.info/ ) 所以要小心;其他选项在 AMD 上可能更快,甚至可能 blsi
在循环中,或者更好地对 popcount 进行二分搜索(见下文)。
只有 Intel 有专门的硬件执行单元用于 pext/pdep 所做的掩码控制的打包/解包,使其成为恒定时间:1 uop,3 周期延迟,只能在端口 1 上运行。
我不知道其他 ISA 具有类似的位打包硬件操作。
pdep
基础知识 :pdep(-1ULL, a) == a
.从第一个操作数中取出低 popcnt(a) 位,并将它们存放在 a
的地方已设置位,会给你 a
再次回来。
但是,如果您的位源不是全 1,而是清除了低 N 位,则 a
中的前 N 个设置位将获取 0 而不是 1。这正是您想要的。
uint64_t unset_first_n_bits_bmi2(uint64_t a, int n){
return _pdep_u64(-1ULL << n, a);
}
-1ULL << n
适用于 C 中的 n=0..63。x86 asm 标量移位指令掩盖了它们的计数(实际上是
&63
),所以这可能是更大
n
的 C 未定义行为会发生的情况.如果您在意,请使用
n&63
在源代码中,因此行为在 C 中定义良好,并且它仍然可以编译为直接使用计数的移位指令。
a
产生相同的结果和
n
.
# GCC10.2 -O3 -march=skylake
unset_first_n_bits_bmi2(unsigned long, int):
mov rax, -1
shlx rax, rax, rsi
pdep rax, rax, rdi
ret
(SHLX 是单 uop,1 周期延迟,与更新 FLAGS 的传统可变计数移位不同......除非 CL=0)
a
的 3 个周期延迟-> 输出(只是 pdep)
n
的 4 个周期延迟-> 输出(shlx,pdep)。
pext(a,a)
将打包底部的位 , 喜欢
(1ULL<<popcnt(a)) - 1
但如果所有位都设置,则不会溢出。
pdep
扩展会工作。但是,这是一种过于复杂且昂贵的方法来创建具有 N 个零以上的足够位的位源,这对于 pdep 来说才是真正重要的。感谢@harold 在本答案的第一个版本中发现了这一点。
popcount(x>>c) == popcount(x) - N
找出要清除多少低位,最好使用
c
的无分支更新. (例如
c = foo ? a : b
经常编译为 cmov)。
x & (-1ULL<<c)
使用那个计数,或者只是
tmp << c
移回
x>>c
结果你已经有了。直接使用右移比生成一个新的掩码并在每次迭代中使用它更便宜。
-mpopcnt
或
-march=native
进行编译)。
关于bit-manipulation - 如何取消设置最右边的 N 个设置位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65817459/
我必须为 IE11 编写一些网格回退。 我想将元素 4 放在右下角,以便元素 1 可以一直向下延伸到底部吗? 我认为这对 flexbox 来说是不可能的,对吧? : https://jsfiddle.
您好,我正在尝试让 2 个 div 在左侧与右侧对齐。 #div1 #div2 #div1 #div2 #div3 #div2 #div3 #div3 诀窍是当浏览器窗口变小时,我希望#div2 位于
如何才能点击 EditText 的右侧可绘制对象(查看屏幕截图)?我尝试了几种方法,但总是卡住。 public static Matcher withEditTextDrawable(final in
这个问题在这里已经有了答案: In CSS Flexbox, why are there no "justify-items" and "justify-self" properties? (6
所以我有 10 个复选框,每个标签都取自数组中相应的索引。我正在使用 ng-repeat 来展示它们: {{entity}}
我是一名优秀的程序员,十分优秀!