反转位数
例如,我有二进制数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或更高版本。
- 使用
>>>=
而不是>>=
- 如果要将方法签名更改为
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()会隐藏左边的零。
金属| ,, |