如何在Java中以编程方式实现数字二进制位翻转?
在Java中通过异或运算实现二进制位翻转
你提到的需求是把数字的二进制位逐位翻转(0变1,1变0),比如6(二进制0110)变成9(二进制1001),用异或运算确实是最直接的方案,核心思路就是让目标数字和对应位数的全1二进制数做异或操作。
原理说明
异或运算的核心规则正好契合位翻转的需求:
1 ^ 0 = 1:原来的0位翻转为11 ^ 1 = 0:原来的1位翻转为00 ^ 0 = 0:高位补的0翻转后还是0,不会影响有效位的结果
所以只要找到一个和目标数字有效位数一致的全1数,两者异或就能完成位翻转。
具体实现方式
1. 翻转全部32位(Java int类型默认位数)
Java里int是32位有符号整数,~0会生成一个二进制全1的数(对应十进制的-1),直接用它和目标数异或就能翻转所有32位:
int n = 6; int flipped = n ^ ~0; System.out.println(flipped); // 输出 -7,对应32位全翻转后的结果
这里要注意,因为Java的int是有符号的,翻转后如果最高位是1,会被解析为负数。如果只需要翻转低N位(比如你例子里的4位有效数),就需要用掩码来限定位数。
2. 翻转指定位数(比如4位、8位)
如果只需要翻转固定的几位,就用对应位数的全1掩码:
- 4位掩码:
0b1111(即十进制15) - 8位掩码:
0xff(十进制255) - 16位掩码:
0xffff(十进制65535)
拿你举的例子,6是4位有效二进制数,用4位掩码异或就能得到想要的结果:
int n = 6; int mask = 0b1111; // 或者直接写15 int flipped = n ^ mask; System.out.println(flipped); // 输出9,正好是目标结果
3. 动态适配有效位数
如果不知道目标数的有效位数,可以先计算出最高有效位的位置,再生成对应掩码:
int n = 6; // 计算最高有效位的位置 int highestBit = Integer.highestOneBit(n); // 生成对应位数的全1掩码 int mask = (highestBit << 1) - 1; int flipped = n ^ mask; System.out.println(flipped); // 输出9
这个方法会自动匹配目标数的有效位数,比如n=6(最高位是4,即100),掩码就是1000*2 -1 = 1111,刚好是4位全1。
注意事项
- Java的
long类型是64位,如果处理长整数,要对应使用~0L或者64位的掩码。 - 有符号整数的最高位是符号位,翻转后可能会改变正负性,如果只关心低N位的翻转,一定要用掩码限定范围。
内容的提问来源于stack exchange,提问作者src3369
相关产品推荐
相关产品推荐

