[英]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或更高版本。
>>>=
而不是>>=
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.