for (int i = 32; i <= 127; i++) {
}
i将数字int 32
转换为二进制数字00100000
,将数字int 127
转换为二进制01111111
。我需要从右读取的第一个位置(位编号 - 查找第一组(FFS)或查找第一个(FFO)),00100000-> 6
和011111111-> 1
谢谢!
API也是您的朋友:
static int position(int a){
int pos = Integer.numberOfTrailingZeros(a);
return pos == 32 ? -1 : pos;
}
找到此数字的简单方法如下:
int findLowestSetBit(int n) {
for (int i = 0 ; i != 32 ; i++) {
if ((n & (1 << i)) != 0) {
return i;
}
}
return -1;
}
但是,它不是最快的,因为它搜索了一个"线性"位。您可以与从BIT HACK页面复制的以下代码并行执行此操作:
int v; // 32-bit word input to count zero bits on right
int c = 32; // c will be the number of zero bits on the right
v &= -v;
if (v != 0) c--;
if ((v & 0x0000FFFF) != 0) c -= 16;
if ((v & 0x00FF00FF) != 0) c -= 8;
if ((v & 0x0F0F0F0F) != 0) c -= 4;
if ((v & 0x33333333) != 0) c -= 2;
if ((v & 0x55555555) != 0) c -= 1;
找到一个领先的零,您可以使用递归&amp;位偏移
我在此处发布了类似问题的答案:
计数引导零(CLZ)或JAVA中的领先零(NLZ)数量
或使用神&amp;征服算法在这里有一些示例:
如何计算32位整数中的设置位数?