【发布时间】:2016-06-27 22:40:12
【问题描述】:
for (int i = 32; i <= 127; i++) {
}
我将数字int 32 转换为二进制数字00100000 并将数字int 127 转换为二进制01111111。我需要从右侧读取的第一个位置(位编号 - 查找第一个集合 (ffs) 或查找第一个 (ffo)),00100000 -> 6 和 01111111 -> 1
谢谢!
【问题讨论】:
for (int i = 32; i <= 127; i++) {
}
我将数字int 32 转换为二进制数字00100000 并将数字int 127 转换为二进制01111111。我需要从右侧读取的第一个位置(位编号 - 查找第一个集合 (ffs) 或查找第一个 (ffo)),00100000 -> 6 和 01111111 -> 1
谢谢!
【问题讨论】:
API 也是你的朋友:
static int position(int a){
int pos = Integer.numberOfTrailingZeros(a);
return pos == 32 ? -1 : pos;
}
【讨论】:
int pos = Integer.numberOfTrailingZeros(a)+1; return pos == 33 ? -1 : pos;。这只是一个口味问题(是否位在第 0 位)。通常,约定是说第一位在位置 0。
pos == 32 ? -1 : pos 以及如何得到结果吗?我想明白。谢谢!
if(pos == 32) return -1; else return pos; 相同这称为条件运算符:docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
找到这个数字的简单方法如下:
int findLowestSetBit(int n) {
for (int i = 0 ; i != 32 ; i++) {
if ((n & (1 << i)) != 0) {
return i;
}
}
return -1;
}
但是,它不是最快的,因为它“线性”地搜索一组位。您可以与以下代码copied from the bit hack page 并行执行:
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;
【讨论】:
if ((v & ....) != 0) 而不仅仅是 if (v & ....),因为 Java 要求 if 条件是 boolean 而不是 int。跨度>
【讨论】: