【问题标题】:Bit numbering - find first set (ffs) or find first one (ffo) Java位编号 - 查找第一个集合 (ffs) 或查找第一个 (ffo) Java
【发布时间】: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

谢谢!

【问题讨论】:

    标签: java bit


    【解决方案1】:

    API 也是你的朋友:

    static int position(int a){
        int pos = Integer.numberOfTrailingZeros(a);
        return pos == 32 ? -1 : pos;
    }
    

    【讨论】:

    • @user3235117 你可以做int pos = Integer.numberOfTrailingZeros(a)+1; return pos == 33 ? -1 : pos;。这只是一个口味问题(是否位在第 0 位)。通常,约定是说第一位在位置 0。
    • @user3235117 如果你只有一个字节而不是一个整数我建议你看看我在stackoverflow.com/a/21351222/57695987654321@之前问这个问题时给出的答案
    • @ZouZou 你能简单解释一下为什么pos == 32 ? -1 : pos 以及如何得到结果吗?我想明白。谢谢!
    • @user3235117 你不明白什么?语法?
    • @user3235117 这与if(pos == 32) return -1; else return pos; 相同这称为条件运算符:docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html
    【解决方案2】:

    找到这个数字的简单方法如下:

    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;
    

    【讨论】:

    • 要将此代码转换为 Java,您需要说 if ((v &amp; ....) != 0) 而不仅仅是 if (v &amp; ....),因为 Java 要求 if 条件是 boolean 而不是 int。跨度>
    • 这一行有多个标记 - 标记 ")" 上的语法错误,;预期 - 令牌“(”,;预期的语法错误
    【解决方案3】:

    要找到leading zeros,您可以使用递归和bit wise shift

    我在这里发布类似问题的答案:

    count leading zeros (clz) or number of leading zeros (nlz) in Java

    或使用Divine & Conquer Algorithm,这里有一些示例:

    How to count the number of set bits in a 32-bit integer?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2013-01-29
      相关资源
      最近更新 更多