gpt4 book ai didi

Java - 位操作表现得很奇怪

转载 作者:行者123 更新时间:2023-12-02 02:55:26 25 4
gpt4 key购买 nike

我目前有简单的功能

public static void convert() {
for (int i = 0; i < byteArray.length; i++) {
byteArray[i] = (byte) (byteArray[i] & ~(1 << 0));

String s = ("0000000" + Integer.toBinaryString(0xFF & byteArray[i])).replaceAll(".*(.{8})$", "$1");
System.out.println(s);
}
}

它遍历字节数组并修改每个位。输出如下:

11110110
11000010
11111010
然而,奇怪的是,当我在函数中的行周围添加一个简单的 if 语句(不会改变任何内容)时,输出完全改变了。例如,如果我将上面的函数更改为

public static void convert() {
for (int i = 0; i < byteArray.length; i++) {

if (5 > 3) {
byteArray[i] = (byte) (byteArray[i] & ~(1 << 0));

String s = ("0000000" + Integer.toBinaryString(0xFF & byteArray[i])).replaceAll(".*(.{8})$", "$1");
System.out.println(s);
}
}
}

它输出以下内容:

10100110
00011000
00010100

我真的很困惑为什么会发生这种情况。谢谢。

全类仅供引用:

public class LIB {
static byte[] byteArray;
static ArrayList<String> bitArray = new ArrayList<String>();
static String messageToDecode = "001010110";
static char[] mtdChar = messageToDecode.toCharArray();
static ArrayList<String> FinalBitArray = new ArrayList<String>();

public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
imageToBits();
convert();

}

public static void imageToBits () throws IOException {
//get image bytes
byteArray = Files.readAllBytes(new File("/Users/2020shatgiskessell/Desktop/url.jpg").toPath());
for (int i = 0; i < byteArray.length; i++) {

String s = ("0000000" + Integer.toBinaryString(0xFF & byteArray[i])).replaceAll(".*(.{8})$", "$1");
bitArray.add(s);

}
}


public static void convert() {
for (int i = 0; i < byteArray.length; i++) {

if (5 > 3) {
byteArray[i] = (byte) (byteArray[i] & ~(1 << 0));

String s = ("0000000" + Integer.toBinaryString(0xFF & byteArray[i])).replaceAll(".*(.{8})$", "$1");
System.out.println(s);
}
}
}

最佳答案

我开始好奇 @LittleSanti 提到的愚人节笑话。如果是这样,那就太卑鄙了。

我写了以下内容;我将赋值消除回源数组,并将“奇怪行为”条件放入循环中,而不是使其两次单独运行,以便我们可以更轻松地看到结果。您这里的(诚然奇怪的)表达式中没有任何这种奇怪的行为。

package bitplay;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;

public class Bitplay
{
// public class LIB {
static byte[] byteArray;
static ArrayList<String> bitArray = new ArrayList<String>();
static String messageToDecode = "001010110";
static char[] mtdChar = messageToDecode.toCharArray();
static ArrayList<String> FinalBitArray = new ArrayList<String>();

public static void main(String[] args) throws IOException {
fakeRoutine();
}

private static void fakeRoutine()
{
byte[] array = new byte[] { (byte)0b11110111,
(byte)0b11000011,
(byte)0b11111010
};
for (int i=0; i<3; i++)
{
String s = ("0000000" + Integer.toBinaryString(0xFF & array[i])).replaceAll(".*(.{8})$", "$1");
System.out.println("1: " + s);

byte clearedOne = (byte) (array[i] & ~(1 << 0));
s = ("0000000" + Integer.toBinaryString(0xFF & clearedOne)).replaceAll(".*(.{8})$", "$1");
System.out.println("2: " + s);

if (5 > 3)
{
clearedOne = (byte) (array[i] & ~(1 << 0));
s = ("0000000" + Integer.toBinaryString(0xFF & clearedOne)).replaceAll(".*(.{8})$", "$1");
System.out.println("3: " + s);
}
}

}
}

如果没有在其他地方同时更改数组,我想到的关于输出差异的唯一其他解释是输入差异,我无法帮助您。

我从上面得到的输出是:

1: 11110111
2: 11110110
3: 11110110
1: 11000011
2: 11000010
3: 11000010
1: 11111010
2: 11111010
3: 11111010
正如预期的那样。如果您提出更具体的问题,请继续提问,但我已经回答完了这个问题。

关于Java - 位操作表现得很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43161734/

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