将整体数据按位翻转,1000 1001 0111 0011整体按位翻转,变为1100 1110 1001 0001。
思路:
1)先将输入数据的字节顺序翻转,例如输入字节的顺序是 “字节1 字节2”,将字节顺序翻转后为 “字节2 字节1”
2)再将上一步输出的字节数组,对每个字节按位翻转
代码示例:
定义功能类:
package com.thb;
public class BitOperationUtil {
private static final int ONE = 1;
/**
* 将一个字节翻转.
* 例如11001010翻转后为01010011
* @param source 输入的字节
* @return 翻转后的字节
*/
public static byte invertOneByte(byte source) {
int result = 0;
int temp;
int temp2;
int data = Byte.toUnsignedInt(source);
for (int i = 0; i <= 7; i++) {
temp = data & ONE;
// 左移位
temp2 = temp << (7 - i);
// 位或操作
result |= temp2;
// 右移1位
data >>= 1;
}
return (byte)result;
}
/**
* 将整体数据按位翻转.
* 例如:1000 1001 0111 0011整体按位翻转,变为1100 1110 1001 0001
* 思路分两个大步:
* 1)先将输入数据的字节顺序翻转,例如输入字节的顺序是 "字节1 字节2",将字节顺序翻转后为 "字节2 字节1"
* 2)再将上一步输出的字节数组,对每个字节按位翻转
* @param source 输入的字符串数组
* @return 每个字节按位翻转以后的字节数组
*/
public static byte[] invertWholeDataByBit(byte[] source) {
byte[] data = source.clone();
byte[] temp = new byte[data.length];
// 将字节数组的字节顺序翻转
for (int i = 0; i < data.length; i++) {
temp[data.length - 1 - i] = data[i];
}
// 将字节数组中的每个字节按位翻转
for (int i = 0; i < temp.length; i++) {
temp[i] = invertOneByte(temp[i]);
}
return temp.clone();
}
}
定义主类,进行调用:
package com.thb;
public class Demo3 {
public static void main(String[] args) {
final byte[] source = {(byte)0b10001001, 0b01110011};
final byte[] target = BitOperationUtil.invertWholeDataByBit(source);
System.out.println("input data: ");
for (int i = 0; i < target.length; i++) {
System.out.println(Integer.toBinaryString(Byte.toUnsignedInt(source[i])));
}
System.out.println("reverted data: ");
for (int i = 0; i < target.length; i++) {
System.out.println(Integer.toBinaryString(Byte.toUnsignedInt(target[i])));
}
}
}
运行输出:
input data:
10001001
1110011
reverted data:
11001110
10010001