gpt4 book ai didi

java - 翻转超过最大字节大小的位移位有问题吗?

转载 作者:行者123 更新时间:2023-11-30 11:59:26 28 4
gpt4 key购买 nike

我正在尝试对二进制字符串进行简单的剖腹产移位,它需要是可逆的。我已经用这种方法做到了..

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

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;
}

当我用 12 的 cShift 运行它,然后用 -12 的 cShift 反转时,我得到这个......

01110100011001010111001101110100001000010011001000110010010001100010101000100000
111111111000000001110001011111111111111110000000001011010011111000111110010100100011011000101100
ÿ?qÿ?->>R6,
ÿótesÿót!22F*

第一个字符串只是将测试字符串转换为二进制。第二个字符串是 cShift 的二进制结果。第三个字符串是this转ascii的结果,第四个字符串是cShift用-12取反转ascii的结果。

我很清楚,翻转会以某种方式添加额外的位,我不完全确定如何处理它。谢谢。

最佳答案

扩展为char时需要屏蔽byte,否则符号位会被扩展。

ascii += (char)(sum & 0xFF)

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

anInt = aByte & 0xFF;
anInt = aShort & 0xFFFF;
aLong = anInt & 0xFFFFFFFFL; // notice the L

举个例子来说明:

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

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

// Java Puzzlers, Puzzle 6: Multicast
System.out.println((int) (char) (byte) -1); // prints 65535

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

  • 避免使用 byteshort。您很少需要这样做。
  • 如果您与他们一起工作,请始终注意掩饰的需要。
  • bytechar 总是很棘手,因为:
    • 虽然 charbyte 宽...
    • char 是无符号的,而 byte 是!!!
    • 因此,这不是简单的扩大转换,而是扩大-缩小转换!

JLS 5.1.4 Widening and Narrowing Primitive Conversions

The following conversion combines both widening and narrowing primitive conversions:

  • byte to char.

First, the byte is converted to an int via widening primitive conversion, and then the resulting int is converted to a char by narrowing primitive conversion.


其他引用资料

关于java - 翻转超过最大字节大小的位移位有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2609421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com