例如,我有二进制数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。错误是什么?
答案 0 :(得分:24)
你将b
一次转移太多了。首先进行转换(这是第一次,当b == 0
时,它没有效果):
while (x!=0){
b<<=1;
b|=( x &1);
x>>=1;
}
答案 1 :(得分:14)
稍微偏离主题。还可以选择Java的内置位反转功能。
请参阅http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#reverse(int)
编辑:这假设您使用的是Java 1.5或更新版本。
答案 2 :(得分:3)
>>>=
代替>>=
public static byte reverse(byte in)
,则这对负值无效,因为隐式转换为int。答案 3 :(得分:2)
该程序不适用于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。
答案 4 :(得分:2)
初学者注意事项:我使用十六进制(0-9和A-F),因为一个十六进制数字完美地映射到4个二进制位。我没有写1010,而是使用A(十进制10)。你可以告诉Java使用十六进制(文字),从0x0开始,如0x0A。
如前所述,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
答案 5 :(得分:1)
b经常向左移动一次。我希望输入1导致输出2.向上移动两行。
答案 6 :(得分:1)
while (x!=0){
b<<=1;
b|=( x &1);
x>>=1;
}
System.out.println(b);
答案 7 :(得分:1)
你离开b
一次超过要求。在while循环后添加b >>= 1
。
答案 8 :(得分:1)
while(x!=0){
b<<=1;
b|=(x&1);
x>>=1;
}
答案 9 :(得分:0)
结果是预期的两倍,因此最后一次左移操作(一个左移使该值翻倍)太多了。
答案 10 :(得分:0)
在while循环中使用无符号右移运算符(&gt;&gt;&gt;)可以安全地避免因为-ve数而遇到无限循环的危险。
while (x!=0){
b<<=1;
b|=( x &1);
x>>>=1;
}
答案 11 :(得分:0)
我的新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()会隐藏左边的零。
金属| ,, |