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)
混合按位运算和字符串混合不会提高性能并降低代码的可重复性。
\n假设它bitIndex是从零开始的,则可以使用类似的 XOR 运算符来完成(归功于@I\xc5\x82ya Bursov,因为他之前在评论中指出了这一点):
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}\nRun Code Online (Sandbox Code Playgroud)\n\n快速回顾一下 XOR 的工作原理。
\n1 ^ 1 => 0\n0 ^ 1 => 1\n1 ^ 0 => 1\n0 ^ 0 => 0\nRun Code Online (Sandbox Code Playgroud)\n这意味着0位掩码中的零1 << bitIndex是通过移位值创建的1的零在应用 XOR 时不会对结果产生影响。
掩码中只有一个有效位会与该值交互:如果遇到,该位将变成,或者如果在相同位置出现,则该位将变成。1001
例子:
\nvalue = 7,index = 2
111 - value\n ^\n100 - bit-mask `1 << bitIndex`\n\n011 - result is `3`\nRun Code Online (Sandbox Code Playgroud)\nvalue = 0,index = 0
000 - value\n ^\n001 - bit-mask `1 << bitIndex`\n\n001 - result is `1`\nRun Code Online (Sandbox Code Playgroud)\n