反转数字中的位值

Ana*_*oly 0 java integer bit-shift bitwise-operators bitwise-or

我想反转数字中的位值。

该方法应该按位数反转值,如下所示:

public static void main(String[] args) {

    int res = flipBit(7,1);
}

public static int flipBit(int value, int bitIndex) {

    String bin = Integer.toBinaryString(value);
    char newChar = (char) (bin.charAt(bitIndex) ^ bin.charAt(bitIndex));
    
    //pseudo code
    bin[bitIndex] = newChar;    
    
    return Integer.parseInt(bin);
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 5

混合按位运算和字符串混合不会提高性能并降低代码的可重复性。

\n

假设它bitIndex是从零开始的,则可以使用类似的 XOR 运算符来完成(归功于@I\xc5\x82ya Bursov,因为他之前在评论中指出了这一点):

\n
public static int flipBit(int value, int bitIndex) {\n    if (bitIndex < 0 || bitIndex > 31) {\n        throw new IllegalArgumentException();\n    }\n    \n    return value ^ 1 << bitIndex;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

在线演示

\n

快速回顾一下 XOR 的工作原理。

\n
1 ^ 1  =>  0\n0 ^ 1  =>  1\n1 ^ 0  =>  1\n0 ^ 0  =>  0\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着0位掩码中的零1 << bitIndex是通过移位值创建的1的零在应用 XOR 时不会对结果产生影响。

\n

掩码中只有一个有效位会与该交互:如果遇到,该位将变成,或者如果在相同位置出现,则该位将变成。1001

\n

例子:

\n

value = 7,index = 2

\n
111   -   value\n ^\n100   -   bit-mask `1 << bitIndex`\n\n011   -   result is `3`\n
Run Code Online (Sandbox Code Playgroud)\n

value = 0,index = 0

\n
000   -   value\n ^\n001   -   bit-mask `1 << bitIndex`\n\n001   -   result is `1`\n
Run Code Online (Sandbox Code Playgroud)\n