【问题标题】:Reverse bits in number反转位数
【发布时间】:2010-07-02 12:50:03
【问题描述】:

例如,我有二进制数 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) 反转 - 但看起来你想用更少的位反转整数,我把它作为评论留下。
  • 看起来解决方案已经在这里了:stackoverflow.com/questions/746171/…你错过了最后需要额外的转变

标签: java


【解决方案1】:

您转移b 的次数太多了。先换班(这样第一次b == 0的时候就没有效果了):

while (x!=0){
  b<<=1;
  b|=( x &1);
  x>>=1;
}

【讨论】:

  • 如果我们也想考虑填充怎么办? 1011 实际上是 00001011 所以反过来一定是 10110000
  • 然后您可以使用for 循环来执行固定次数的迭代。
  • 你回复了一个 11 岁的帖子!该死!另外,是的,我做到了!谢谢!!我保持了一个计数,然后做了 b
  • 无法抗拒那个红色通知计数器;)
【解决方案2】:

有点跑题了。还有Java内置的位反转功能选项。

http://java.sun.com/javase/6/docs/api/java/lang/Integer.html#reverse(int)

编辑:假设您使用的是 Java 1.5 或更新版本。

【讨论】:

    【解决方案3】:
    1. 使用&gt;&gt;&gt;= 代替&gt;&gt;=
    2. 如果您想将方法签名更改为 public static byte reverse(byte in),这将不适用于负值,因为隐式转换为 int。

    【讨论】:

      【解决方案4】:

      该程序不适用于像 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。

      【讨论】:

        【解决方案5】:

        初学者注意:我使用十六进制(0-9 和 A-F),因为一个十六进制数字完美地映射到 4 个二进制位。我没有写 1010,而是使用 A(十进制)。你可以告诉 Java 使用十六进制(文字),从 0x 开始,如 0x0A。

        如前所述,1 应该输出 8(0001 到 1000)。 因此,代码需要将第一位移动到此示例中所需的位长度为 4,而不是 while(x!=0)。

        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
        

        【讨论】:

          【解决方案6】:

          b 经常左移一次。我希望输入 1 产生输出 2。将 Shift 向上移动两行。

          【讨论】:

            【解决方案7】:

            你移动 b 的次数太多了。在执行 |= 之前尝试将 b 向左移动:

                while (x!=0){
                       b<<=1;
                       b|=( x &1);
                       x>>=1;
            
                     }
               System.out.println(b);
            

            【讨论】:

              【解决方案8】:

              您的左移b 比要求的多一倍。在您的 while 循环后添加 b &gt;&gt;= 1

              【讨论】:

                【解决方案9】:
                while(x!=0){
                    b<<=1;
                    b|=(x&1);
                    x>>=1;
                }
                

                【讨论】:

                  【解决方案10】:

                  结果是预期的两倍,所以最后一次左移操作(一次左移使值加倍)太多了。

                  【讨论】:

                    【解决方案11】:

                    在 while 循环中使用无符号右移运算符 (>>>) 是安全的,可以避免因 -ve 数进入无限循环的危险。

                    while (x!=0){
                      b<<=1;
                      b|=( x &1);
                      x>>>=1;
                    }
                    

                    【讨论】:

                      【解决方案12】:

                      我的新 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
                      • "throws Exception" 不重要,我只用于其他测试。
                      • boolean positive = num&gt;=0;
                      【解决方案13】:
                      //    i/p=3 
                      //    o/p=3221225472
                      // Clearly observe the 1L while doing the left shift, if ignored it will fail to return the expected output dur to mismatch in bit size.
                      
                          public static long reverse(long n) {
                              long rev = 0;
                              for(int i = 31; i >=0; i--){
                                  if((n & 1<<i) != 0){
                                      rev = rev | 1L<<(31-i);
                                  }
                              }
                              return rev;
                          }
                      

                      【讨论】:

                        猜你喜欢
                        • 2011-06-15
                        • 2017-11-18
                        • 2016-01-04
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2016-02-27
                        相关资源
                        最近更新 更多