当前位置: 首页 > 面试题库 >

计数int中使用的位

云镜
2023-03-14
问题内容

如果您的二进制数为10110,我如何获得它以返回5?例如,一个告诉使用多少位的数字?下面列出了一些类似的示例:

  • 101应该返回3
  • 000000011应该返回2
  • 11100应该返回5
  • 101010101应该返回9

如何在Java中获得最简单的方法?我想出了以下方法,但可以更快地完成吗:

public static int getBitLength(int value)
{
    if (value == 0)
    {
        return 0;
    }
    int l = 1;
    if (value >>> 16 > 0) { value >>= 16; l += 16; }
    if (value >>> 8 > 0) { value >>= 8; l += 8; }
    if (value >>> 4 > 0) { value >>= 4; l += 4; }
    if (value >>> 2 > 0) { value >>= 2; l += 2; }
    if (value >>> 1 > 0) { value >>= 1; l += 1; }
    return l;
}

问题答案:

最简单?

32 - Integer.numberOfLeadingZeros(value)

如果您正在寻找算法,则Java API的实现者同意您的分而治之移位方法:

public static int numberOfLeadingZeros(int i) {
    if (i == 0)
        return 32;
    int n = 1;
    if (i >>> 16 == 0) { n += 16; i <<= 16; }
    if (i >>> 24 == 0) { n +=  8; i <<=  8; }
    if (i >>> 28 == 0) { n +=  4; i <<=  4; }
    if (i >>> 30 == 0) { n +=  2; i <<=  2; }
    n -= i >>> 31;
    return n;
}

编辑 :为了提醒那些相信浮点计算的准确性的人,请运行以下测试工具:

public static void main(String[] args) {
    for (int i = 0; i < 64; i++) {
        long x = 1L << i;
        check(x);
        check(x-1);
    }
}

static void check(long x) {
    int correct = 64 - Long.numberOfLeadingZeros(x);
    int floated = (int) (1 + Math.floor(Math.log(x) / Math.log(2)));
    if (floated != correct) {
        System.out.println(Long.toString(x, 16) + " " + correct + " " + floated);
    }
}

检测到的第一个偏差是:

ffffffffffff 48 49


 类似资料:
  • 问题内容: 是否有更好的方法来计数Java8中的int出现次数 问题答案: 尝试:

  • 我在DataFrame中有两列(serverTs,FTs),它们是Unix时间格式的时间戳。在我的代码中,我需要从一个减去另一个。当我这样做时,我收到一个错误,说我不能减去字符串。所以我添加了serverTs和FTs的类型作为整数。 但是程序给了我一个错误: TypeError Traceback(最近一次调用最后一次)熊猫/_libs/parsers.pyx熊猫。_libs.parsers.Te

  • 使用,为什么它显示(原始类型)和数组的不同列表大小? a) 使用array,每当我执行以下程序时,列表大小=1 b) 但是如果我从数组类型更改为数组(比如),那么我得到的列表大小是4,我认为是正确的。 PS:使用(包装类)数组,结果就可以了,但我不确定为什么在primitive数组中,列表大小是1。请解释一下。

  • 问题内容: 我的问题是程序没有按我原意的方式读取代码。 我有 当英雄位置为6时,程序仍转到其他位置。 这是为什么?是因为操作数吗?如果是,我应该如何更改? 问题答案: 用: 这将做您想要的。 你所做的是比较有结果的,将做到按位或这些数字之间。

  • 我很难确定何时使用int、double和long。 我正在计算整数的幂,只要提供的幂不是负数,就返回结果。 对于作业,我需要使用以下代码开始: 以下是我的想法: 我知道我弄乱了int、double或long的使用,但我不知道如何修复它。

  • 创建一个名为平均值的方法,用于计算作为参数传递的数字的平均值。之前创建的方法和必须在此方法中使用! 在以下模板中定义方法: 我正在努力将sum()方法放在average()方法中。我不知道如何让它工作,因为我在eclipse中不断遇到这样的错误: 这是我的代码: 我知道这与我将average方法定义为double类型有关,但我尝试将它们改为double,并调用我的变量“int avg=…”作为“双