我目前有简单的功能
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);
}
}
}
答案 0 :(得分:2)
我开始怀疑@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
正如所料。如果你想出一个更具体的问题,请继续问问,但我已经完成了这个问题。