Java - Bit Manipulation表演奇怪

时间:2017-04-01 20:34:35

标签: java image-processing byte bit

我目前有简单的功能

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

1 个答案:

答案 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

正如所料。如果你想出一个更具体的问题,请继续问问,但我已经完成了这个问题。