首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >翻转最大字节大小的反转位移位的问题?

翻转最大字节大小的反转位移位的问题?
EN

Stack Overflow用户
提问于 2010-04-10 01:09:11
回答 1查看 533关注 0票数 2

我正在尝试对一个二进制字符串做一个简单的剖分移位,并且它需要是可逆的。我已经用这个方法做到了这一点。

代码语言:javascript
复制
public static String cShift(String ptxt, int addFactor)
    {
        String ascii = "";
        for (int i = 0; i < ptxt.length(); i+=8)
        {
            int character = Integer.parseInt(ptxt.substring(i, i+8), 2);
            byte sum = (byte) (character + addFactor);
            ascii += (char)sum;
        }
        String returnToBinary = convertToBinary(ascii);
        return returnToBinary;
    }

这在某些情况下工作得很好。然而,我认为当它被一个字节表示时,它是不可逆转的。在测试字符串"test!22*F "上,如果addFactor12,则该字符串将变为不可逆。为什么会这样?我怎样才能阻止它?

编辑:为了澄清起见,测试字符串在传入之前被转换为二进制。这是convertToBinary

代码语言:javascript
复制
public static String convertToBinary(String str)
    {
        char [] array = str.toCharArray();
        String binaryToBeReturned = "";

        for (int i = 0; i < str.length(); i++)
        {
            String binary = Integer.toBinaryString((int)array[i]);
            binary = padZeroes(binary);
            binaryToBeReturned += binary;
        }
        return binaryToBeReturned;
    }

当我运行cShift为12,然后cShift为-12进行反转时,我得到的结果是...

代码语言:javascript
复制
01110100011001010111001101110100001000010011001000110010010001100010101000100000
111111111000000001110001011111111111111110000000001011010011111000111110010100100011011000101100
ÿ?qÿ?->>R6,
ÿótesÿót!22F*

第一个字符串只是将测试字符串转换为二进制。第二个字符串是二进制形式的cShift的结果。第三个字符串是将其转换为ascii的结果,第四个字符串是在cShift上用-12反转并转换为ascii的结果。

这对我来说很清楚,不知何故,从滚动中添加了额外的比特,我不完全确定如何处理它。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-10 02:30:42

当加宽到char时,需要对byte进行掩码,否则符号位将被扩展。

代码语言:javascript
复制
ascii += (char)(sum & 0xFF)

如果您不想要符号扩展名,则此掩码模式适用于加宽有符号数字类型。

代码语言:javascript
复制
anInt = aByte & 0xFF;
anInt = aShort & 0xFFFF;
aLong = anInt & 0xFFFFFFFFL; // notice the L

这里有一个例子来说明:

代码语言:javascript
复制
byte b = -1; // 0xFF
char ch = (char) b; // 0xFFFF
int i = ch;
System.out.println(i); // prints "65535", which is 0xFFFF

byte b = -1; // 0xFF
char ch = (char) (b & 0xFF); // 0xFF
int i = ch;
System.out.println(i); // prints "255", which is 0xFF

这里有一个教训。如果你读过,你会看到一些围绕着符号扩展的喧嚣。这本书中的谜题基本上与我上面的一样,但可能更令人困惑:

代码语言:javascript
复制
// Java Puzzlers, Puzzle 6: Multicast
System.out.println((int) (char) (byte) -1); // prints 65535

有两种方法可以解决这个问题:

  • 避免使用byteshort。你很少需要这样做。如果你正在使用mask.
  • byte,总是要小心需要缩小到byte...
  • char的转换总是很棘手的,因为:虽然is!!!
  • Therefore,比char宽,但
    • char是无符号的,而byte conversion!

不是简单的加宽转换,而是加宽缩小转换

JLS 5.1.4 Widening and Narrowing Primitive Conversions

以下转换将扩大和缩小基元转换组合在一起:

  • bytechar.

首先,通过扩大基元转换将byte转换为int,然后通过缩小基元转换将得到的int转换为char

其他参考文献

  • 5.1.2 Widening Primitive Conversion
  • 5.1.3 Narrowing Primitive Conversions
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2609421

复制
相关文章

相似问题

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