首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中反转无符号字节的位?

如何在Java中反转无符号字节的位?
EN

Stack Overflow用户
提问于 2010-07-24 18:25:16
回答 6查看 42K关注 0票数 17

我正在尝试写一个非常简单的加密类型的解码器。从0到255的数字通过扫描仪输入,位被反转,然后转换为字符并打印。

例如,数字178应转换为字母"M“。

178等于10110010。

反转所有位应该得到01001101,即77或"M“作为一个字符。

我遇到的主要问题是,据我所知,Java不支持无符号字节。我可以将值读取为int或short,但由于额外的位,这些值在转换过程中将会关闭。理想情况下,我可以只使用按位补码运算符,但我认为如果我使用有符号数字这样做,最终会得到负值。我该如何处理这个问题有什么建议吗?

EN

回答 6

Stack Overflow用户

发布于 2010-07-24 18:42:54

我将简单地使用1进行补码,并通过使用二进制and去掉其他位。

public class Conv {
    public static void main(String[] args) {
        int val = 178;
        val = ~val & 0xff;
        System.out.println((char) val);
    }
}
票数 15
EN

Stack Overflow用户

发布于 2010-07-24 18:42:23

~n & 0xff

~执行补码并像所有数字操作一样隐式地转换为整数,然后& 0xff屏蔽除低8位之外的所有内容以获得无符号值,同样是整数。

我首先以不同的方式阅读了您的问题,颠倒了顺序而不是位的值,这就是答案。

您可以使用Integer.reverse() (未经测试):

Integer.reverse(n << 24) & 0xff
票数 12
EN

Stack Overflow用户

发布于 2010-07-24 18:39:12

Java语言中的位操作是为int定义的,因此使用int而不是byte是有意义的。您可以使用Scanner.nextInt,而不是Scanner.nextByte。您应该验证用户的输入,以确保输入的所有整数都在0到255的范围内,并在遇到超出范围的数字时显示相应的错误消息。

一旦你将数字存储在一个整数中,然后要翻转最低有效的8位,你可以用0xff进行异或运算。对于0到255之间的所有输入,这应该会像您预期的那样工作:

x ^= 0xff;

示例:

String input = "178 0 255";
Scanner s = new Scanner(input);
while (s.hasNextInt()) {
    int x = s.nextInt();
    if (x < 0 || x > 255) {
        System.err.println("Not in range 0-255: " + x);
    } else {
        x ^= 0xff;
        System.out.println(x);
    }
}

结果:

77
255
0
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3324707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档