簡體   English   中英

反轉位數

[英]Reverse bits in number

例如,我有二進制數 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。錯誤是什么?

你轉移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或更高版本。

  1. 使用>>>=而不是>>=
  2. 如果要將方法簽名更改為public static byte reverse(byte in)這對負值不起作用,因為存在隱式轉換為int。

該程序不適用於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。

初學者注意事項:我使用十六進制(0-9和AF),因為一個十六進制數字完美地映射到4個二進制位。 我沒有寫1010,而是使用A(十進制10)。 您可以通過以0x0A開頭的0x開頭告訴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
while(x!=0){
    b<<=1;
    b|=(x&1);
    x>>=1;
}

b經常向左移動一次。 我希望輸入1導致輸出2.向上移動兩行。

你曾經轉移過多次。 在執行| =之前嘗試將b向左移動:

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

         }
   System.out.println(b);

你左移b不是需要一次以上。 在while循環后添加b >>= 1

在while循環中使用無符號右移運算符(>>>)是安全的,可以避免進入-ve數的無限循環的危險。

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

結果是預期的兩倍,因此最后一次左移操作(一個左移使該值翻倍)太多了。

我的新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()會隱藏左邊的零。

金屬| ,, |

//    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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM