如果您坚持直接使用按位运算符,则可以尝试如下操作:
private int mostSignificantBit(int myInt){ int mask = 1 << 31; for(int bitIndex = 31; bitIndex >= 0; bitIndex--){ if((myInt & mask) != 0){ return bitIndex; } mask >>>= 1; } return -1;}我们将掩码初始化为,
1 << 31因为它表示1后跟31
0。我们使用该值来测试索引31(第32个点)是否为1。当
and将此值与一起使用时
myInt,除非在中设置了相应的位,否则将得到0
myInt。如果是这种情况,我们返回
bitIndex。如果不是,则将掩码向右移动1并重试。重复执行,直到用完所有要移位的位置为止,在这种情况下,这意味着未设置任何位(也许您想在此处抛出异常而不是返回-1)。
请注意,这将返回
0for
1和
6for
的值
64(
1000000以二进制形式)。您可以根据需要进行调整。还请注意,我使用的是无符号右运算符,而不是有符号右移。这是因为此处的目的是处理原始位而不是其有符号的解释,但是在这种情况下并不重要,因为所有负值都将在移位发生之前在循环的第一次迭代中终止。



