反转位数

例如,我有二进制数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的内置位反转function选项。

见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。

初学者注意事项:我使用hex(0-9和AF),因为一个hex数字完美地映射到4个二进制位。 我没有写1010,而是使用A(十进制10)。 您可以通过以0x0A开头的0x开头告诉Java使用hex(文字)。

如前所述,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=DC=3 D=BE=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 

b经常向左移动一次。 我希望输入1导致输出2.向上移动两行。

你曾经转移过多次。 尝试在执行| =之前将b向左移动:

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

你离开的时间超过要求的一倍。 在while循环后添加b >>= 1

 while(x!=0){ b<<=1; b|=(x&1); x>>=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()会隐藏左边的零。

金属| ,, |