java整数翻转_关于Java:数字反转位数

例如,我的二进制数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)反转完整的Integer-但由于您似乎想反转位数较少的整数,因此我将其保留为注释。

看来解决方案已经在这里:stackoverflow.com/questions/746171/您错过了最后需要进行额外轮班的情况

您将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的情况。

初学者注意:我使用十六进制(0-9和A-F),因为一个十六进制数字完美地映射到4个二进制位。我没有写1010,而是使用A(十进制的10)。您可以通过以0x开头(如0x0A中一样)来告诉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

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

while(x!=0){

b<<=1;

b|=(x&1);

x>>=1;

}

您将b的移动量比要求的多了一次。在while循环后添加b >>= 1。

您将b移了太多次。在执行| =之前,尝试将b左移

while (x!=0){

b<<=1;

b|=( x &1);

x>>=1;

}

System.out.println(b);

b太左移一次。我希望输入1导致输出2。将Shift向上移动两行。

我的新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 <0)? 假:真; 并忘记下一个if语句。

"抛出异常"并不重要,我仅将其用于其他测试。

或boolean positive = num>=0;

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

while (x!=0){

b<<=1;

b|=( x &1);

x>>>=1;

}

结果是预期的两倍,因此最后一次左移操作(一个左移将值翻倍)太多了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值