我想找到设置为1的最重要的位.我已经尝试了所有可能的方式来自& ORing从1到31的所有位,它不起作用.
就像1000000我想拥有7.
解决方法
如果你坚持直接使用按位运算符,你可以尝试这样的事情:
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.当我们和myInt使用此值时,除非在myInt中设置相应的位,否则我们得到0.如果是这种情况,我们返回bitIndex.如果没有,那么我们将掩码向右移动1并再试一次.我们重复,直到我们用完要移位的地方,在这种情况下,它意味着没有设置任何位(可能你想在这里抛出异常而不是返回-1). 请注意,这将返回值0为1和6为64(二进制为1000000).如果您愿意,可以调整.另请注意,我使用了无符号右运算符而不是带符号的右移位运算符.这是因为这里的意图是处理原始位而不是它们的带符号解释,但是在这种情况下无关紧要,因为所有负值将在转换发生之前在循环的第一次迭代中终止.