int a = 12;
例如:12 的二进制是 1100,所以答案应该是 3,因为设置了右起第 3 位。
我想要最后一个最设置位的位置a
。谁能告诉我该怎么做。
NOTE:我只想要位置,在这里我不想设置或重置该位。所以它与 stackoverflow 上的任何问题都不重复。
这个答案取消设置最右边的设置位 https://stackoverflow.com/a/4704041/3625404告诉如何获取和取消设置最右边的设置位对于表示为二进制补码的无符号整数或有符号整数.
获取最右边的设置位,
x & -x
// or
x & (~x + 1)
取消设置最右边的设置位,
x &= x - 1
// or
x -= x & -x // rhs is rightmost set bit
为什么它有效
x: leading bits 1 all 0
~x: reversed leading bits 0 all 1
~x + 1 or -x: reversed leading bits 1 all 0
x & -x: all 0 1 all 0
eg, let x = 112
,并为简单起见选择 8 位,尽管对于所有大小的整数来说这个想法都是相同的。
// example for get rightmost set bit
x: 01110000
~x: 10001111
-x or ~x + 1: 10010000
x & -x: 00010000
// example for unset rightmost set bit
x: 01110000
x-1: 01101111
x & (x-1): 01100000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)