私はバイト配列を持っていますmyByteArray[82]
この配列の正確に 37 ビットを補数値に変更したいと考えています。すなわち。bit0 に「1」がある場合は、「0」に変更します。このバイト配列にエラーを導入するには、最初の 37 ビットを変更する必要があります。
これを行う方法を提案してください
試す
byte[] a82 = ...
Set<Integer> set = new HashSet<Integer>();
while (set.size() < 37) {
set.add((int) (Math.random() * 82));
}
for (int i : set) {
int ibyte = i / 8;
int ibit = i % 8;
int m = 1 << ibit;
a[ibyte] ^= m;
}
あなたがやろうとしていることは完全には明らかではありません。私が最もよく理解しているのは、82 バイトの配列があり、配列の最下位 37 ビットを反転したいということです。1バイトは8ビットなので、これを行うことができます:
byte[] myByteArray = new byte[82];
// invert lowest 32 bits, 8 at a time
for (int i = 0; i < 4; ++i) {
myByteArray[i] = (byte)(~myByteArray[i]);
}
// invert next five bits
myByteArray[4] = (byte) (
(myByteArray[4] & 0xE0) // top 3 bits unchanged
|
((~myByteArray[4)) & 0x1F) // bottom 5 bits inverted
);
これは機能します:
int nBits = 37;
int i = 0;
for (; i<nBits / 8; ++i)
myByteArray[i] = (byte)((byte) myByteArray[i] ^ 0xFF);
myByteArray[i] = (byte)(myByteArray[i] ^ ((0xFF >>> 5) ^ 0xFF));
最後の行で 0xFF を使用して最終的な XOR を実行するかどうかは、最上位ビットを最初のビット (使用する) と見なすか、最後のビット (省略する) と見なすかによって異なります。
ランダムに選択された特定の 37 ビットを反転するには:
// array of 82 bytes with 37 selected bits set to 1, all the rest zero
// you could generate this programmatically as well if you need a different
// set of bits each time, but your question implies you don't
byte[] mask = { 0x00, 0x01, 0x02, 0x80, .... 0x00 };
for (int i=0; i<myByteArray.length; i++)
{
myByteArray[i] ^= mask[i];
}
ビット排他的 OR 演算子を使用します^
。xor の真理値表は
M a s k
| 0 | 1
D -+---+---
a 0| 0 | 1
t -+---+---
a 1| 1 | 0
マスクに 1 がある場合は常に、データ内の対応するビットが反転されます。