- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试获取整数的数字 0 的最左边位置
int a = 83
例如,83的二进制是1010011,所以我们最左边的位0的位置是第6位。我想知道有没有办法只使用按位运算符来找到答案?
最佳答案
TL;DR
private static int leftmostZeroBit(int a) {
int b = Integer.highestOneBit(a);
return (b == 0 ? -1 : 31 - Integer.numberOfLeadingZeros(a ^ b ^ (b - 1)));
}
private static int leftmostZeroBit(long a) {
long b = Long.highestOneBit(a);
return (b == 0 ? -1 : 63 - Long.numberOfLeadingZeros(a ^ b ^ (b - 1)));
}
说明
不知道这与简单的位搜索循环相比是否有效,但您可以使用以下方法来帮助:
Integer.highestOneBit(int i)
Integer.numberOfLeadingZeros(int i)
它们都使用位操作,因此它们需要不到 32 次迭代(如果使用 Long
版本,则需要 64 次迭代)。
给定示例输入值 1101011
,我们希望将其反转为 0010100
。
请记住,int
有 32 位,因此其左侧有 25 个 0 位,因此要反转它,我们需要与掩码 1111111
进行异或.
可以通过调用 highestOneBit()
计算该掩码,得到 1000000
,减去 1 得到 0111111
,将它们组合起来得到面具。
完成 XOR 并得到 0010100
后,我们计算 31 - numberOfLeadingZeros()
以找到前导 1 位的位置,即 4 in这个例子。
然后,我们可以定义对于无效输入,我们希望结果为 -1
:
000
无效,因为最左边的 0 位没有 1 位111
无效,因为 1 位后面没有 0 位这为我们提供了答案顶部的代码。
测试
public static void main(String[] args) {
test(0x6B); // example in answer
test(0x53); // example in question (83)
test(0x29);
test(0x14);
test(0x0A);
test(0x05);
test(0x02);
test(0x01);
test(0x00);
test(0x80000000);
test(0xFFFFFFFE);
}
private static void test(int a) {
System.out.printf("%32s: %d%n", Integer.toBinaryString(a), leftmostZeroBit(a));
}
输出
1101011: 4
1010011: 5
101001: 4
10100: 3
1010: 2
101: 1
10: 0
1: -1
0: -1
10000000000000000000000000000000: 30
11111111111111111111111111111110: 0
关于java - 获取数字最左边0位的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43997337/
我正在开发一个需要在屏幕上查找对象的程序,到目前为止工作正常,但我遇到了多显示器配置问题。 GraphicsEnvironment.getLocalGraphicsEnvironment().getS
使用 mySql,我想列出客户对特定产品类别进行的所有购买。 所以,我有 3 个表:客户 (idCustomer, Name)、类别 (idCategory, CategoryName) 和订单 (i
我的网站上有一个关于 background-size:cover 的小问题我一直在 Firefox 中测试它,但是当我在谷歌浏览器中加载页面时,我在左边得到 1px 的白色。当我使用 backgrou
我已经搜索了几个小时来找到解决我的问题的方法,但没有成功。我遇到的问题是两个按钮的垂直堆叠。 这就是我想要做的:它说按钮在这里两次是我试图放置按钮的地方,但我所能做的就是让它们水平排列而不是垂直排列。
我有一个包含多个元素的导航栏。 Left1 Left2 Left3 Right1 Right2 Right3 我不知道如何将“fixedLef
您好,我正在尝试让 2 个 div 在左侧与右侧对齐。 #div1 #div2 #div1 #div2 #div3 #div2 #div3 #div3 诀窍是当浏览器窗口变小时,我希望#div2 位于
body { font-family: Arial, Helvetica, sans-serif; font-size: 13px;
这个问题在这里已经有了答案: In CSS Flexbox, why are there no "justify-items" and "justify-self" properties? (6
这是我的代码的 jsfiddle 链接: https://jsfiddle.net/Krisalay/zvxxeagh/ 我的 HTML 代码是: MESSAGE 1
所以我有 10 个复选框,每个标签都取自数组中相应的索引。我正在使用 ng-repeat 来展示它们: {{entity}}
我是一名优秀的程序员,十分优秀!