反转位数

时间:2010-07-02 12:50:04

标签: java

例如,我有二进制数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。错误是什么?

12 个答案:

答案 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)

  1. 使用>>>=代替>>=
  2. 如果您想将方法签名更改为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)

你过多地转移了b。尝试在执行| =:

之前将b向左移动
    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()会隐藏左边的零。

金属| ,, |