例如,我的二进制数1011等于十进制11。我想要反向位的位置,使其变为1101,即十进制13。这是代码:
import java.util.*;
public class bits {
public static void main(String[] args) {
Scanner scnr=new Scanner(System.in);
System.out.println("enter x:");
int x=scnr.nextInt();
int b=0;
while (x!=0){
b|=( x &1);
x>>=1;
b<<=1;
}
System.out.println(b);
}
}
但是,当我输入x 11时,它将显示26。这是什么错误?
可以使用Integer.reverse(int i)反转完整的Integer-但由于您似乎想反转位数较少的整数,因此我将其保留为注释。
看来解决方案已经在这里:stackoverflow.com/questions/746171/您错过了最后需要进行额外轮班的情况
您将b移位了太多次。首先进行移位(以便第一次使用b == 0时无效):
while (x!=0){
b<<=1;
b|=( x &1);
x>>=1;
}
有点题外话。 Java的内置位反转功能也可以选择。
参见http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#reverse(int)
编辑:这假定您正在使用Java 1.5或更高版本。
使用>>>=代替>>=
如果要将方法签名更改为public static byte reverse(byte in),这将不适用于负值,因为存在隐式强制转换为int的情况。
初学者注意:我使用十六进制(0-9和A-F),因为一个十六进制数字完美地映射到4个二进制位。我没有写1010,而是使用A(十进制的10)。您可以通过以0x开头(如0x0A中一样)来告诉Java使用十六进制(文字)。
如前所述,1应该输出8(0001至1000)。
因此,代替while(x!= 0),代码需要将第一位移位到本示例中所需的位的长度为4。
for (int i = 0; i < 4; ++i) { // not while (x!=0){
b<<=1;
b|=( x &1);
x>>=1;
}
Hex convert 0-F: 0=0 1=8 2=4 3=C 4=2 5=A 6=6 7=E 8=1 9=9 A=5 B=D C=3 D=B E=7 F=F
还是完整的8位示例:
public static byte reverse(byte x) {
byte b = 0;
for (int i = 0; i < 8; ++i) {
b<<=1;
b|=( x &1);
x>>=1;
}
return b;
}
public static void main(String args[]) {
byte[] nums = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
(byte) 0xAA, (byte) 0xFE, (byte) 0xFF };
for (byte b : nums) {
System.out.printf("%02X=%02X", b, reverse(b));
}
System.out.println();
}
输出:
00=00 01=80 02=40 03=C0 04=20 05=A0 06=60 07=E0 08=10
09=90 0A=50 0B=D0 0C=30 0D=B0 0E=70 0F=F0 10=08 11=88 AA=55 FE=7F FF=FF
该程序不适用于1、2之类的输入
int reverseBits(int x)
{
int b = 0;
while (x != 0)
{
b <<= 1;
b |= ( x & 1);
x >>= 1
}
return b;
}
输入1输出1,应该是8对吗?
输入2输出1,应为4。
while(x!=0){
b<<=1;
b|=(x&1);
x>>=1;
}
您将b的移动量比要求的多了一次。在while循环后添加b >>= 1。
您将b移了太多次。在执行| =之前,尝试将b左移
while (x!=0){
b<<=1;
b|=( x &1);
x>>=1;
}
System.out.println(b);
b太左移一次。我希望输入1导致输出2。将Shift向上移动两行。
我的新Java代码使用具有强大位处理功能的Java来反转整数中的位。它使用正,负和零值。希望能帮助到你。
public static int reverseDigits(int num) throws Exception {
if (num == 0) {
return Integer.MAX_VALUE | Integer.MIN_VALUE;
}
int count = Integer.SIZE * 8 - 1;
int reversed = num;
boolean positive = true;
if (num < 0) {
positive = false;
}
if (positive) num >>= 1;
while(num != 0) {
reversed <<= 1;
reversed |= (num & 1);
num >>>= 1;
count--;
}
if (positive) reversed <<= count;
return reversed;
}
您可以用Java中的其他位操作代码以整数表示位,在左边打印零:
https://stackoverflow.com/a/39056535/6738542
因为Integer.toBinaryString()将隐藏左侧的零。
金属| ,, |
如果使用此行,会更好:boolean positive =(num <0)? 假:真; 并忘记下一个if语句。
"抛出异常"并不重要,我仅将其用于其他测试。
或boolean positive = num>=0;
在while循环中使用无符号右移运算符(>>>)可以安全地避免-ve数陷入无限循环的危险。
while (x!=0){
b<<=1;
b|=( x &1);
x>>>=1;
}
结果是预期的两倍,因此最后一次左移操作(一个左移将值翻倍)太多了。