2017-02-17 8 views
0

私は少しのコードを使いこなし、ファイル内のビットを切り替えて元のファイルに戻すことにしました。何とか、それはビットを変更しますが、それらを元に戻すことはありません。ここでビットを切り替えますが、ビットを元に戻しませんか?

は私が持っているものです。

魔法はrByteにファイルや関数freadを開く私がたまたま[0]とrByte [1]。

unsigned char rByte[] = {0, 0}; 

int isBitSet(unsigned char byte, int bytePosition){ 

    unsigned char mask[] = {128, 64, 32, 16, 8, 4, 2, 1}; 
    return ((byte & mask[bytePosition]) != 0); 
} 

unsigned char setBit(unsigned char byte, int pos) { 
    byte |= (0x01 << pos); 
    return byte; 
} 

unsigned char clearBit(unsigned char byte, int pos){ 
    byte &= ~(0x01 << pos); 
    return byte; 
} 

/* DO NOT TOUCH */ 

void switchBits (unsigned char byte1, unsigned char byte2, int x, int y) { 

    int reg1 = 0; 
    int reg2 = 0; 

    reg1 = isBitSet(byte1, x); 
    reg2 = isBitSet(byte2, y); 

    if ((reg1 == reg2)) { 

    } 

    if ((reg1 == 0) && (reg2 != 0)){ 
     rByte[0] = setBit(byte1, x); 
     rByte[1] = clearBit(byte2, y); 
    } 

    if((reg2 == 0) && (reg1 != 0)){ 
     rByte[0] = clearBit(byte1, x); 
     rByte[1] = setBit(byte2, y); 
    } 

} 

は今、私は同じswitchBits()が適用される場合、私はそれを感じる方法は、プログラムが定期的に戻って行く必要があることを前提としています。私は音楽ファイルを作って変な騒音を作りましたが、正常に戻っていませんでした。

+0

ビットが1より大きい場合、次のように切り替わります。0 1 2 3(original) - > 1 0 3 2(switched)?スイッチビット(rByte [0]、rByte [1]、4,5); –

+0

; thrの2番目のビットと2番目のビットを切り替える必要があります。 – WickSec

+1

多分ifの代わりにelseを使うべきでしょう。変更が加えられた場合、これ以上の変更は必要ありません。 –

答えて

5

rByteがグローバルに定義されているとします(これはうまくありません)。

ビットの位置がisBitSet()の場合、setBit()clearBit()と比べて逆になっています。 mask[0] == 128 としてではなくそれが1に対応する意味0x01 << 0をシフトsetBitclearBit機能にpos = 0

isBitSetチェックMSB(最上位ビット)を仮定

例。

編集: 私は何を示唆することは、あなたが機能のデザインをoverthinkすべき

unsigned char mask[] = {128, 64, 32, 16, 8, 4, 2, 1}; 

unsigned char mask[] = {1, 2, 4, 8, 16, 32, 64, 128}; 

に編集終了

を変更することで、ちょうどifの連鎖はかなりいるようです奇妙で、あなたが実装したい論理を改善することができます。ここでは単純化されたロジックを使用した例を示します。論理をより具体的にする別の方法もありますので、これを示唆として見てください。再度プログラムを単純化する

if ((reg1 == reg2)) { 

} 
else{ 
    if ((reg1 == 0)){ 
    rByte[0] = setBit(byte1, x); 
    rByte[1] = clearBit(byte2, y); 
    } 

    else{ 
    rByte[0] = clearBit(byte1, x); 
    rByte[1] = setBit(byte2, y); 
    } 
} 

もう一つは、ちょうどその逆1と外の0を作るスイッチ機能になります。これはXOR演算子^によって簡単に実行できます。両方が異なる場合は、両方のビットの状態を切り替えるだけで機能が減ります。

if ((reg1 != reg2)) { 
    rByte[0] = switchBit(byte1,x); 
    rByte[1] = switchBit(byte2,y); 
} 
+0

これはグローバルに定義されていますが、switchBits()を2回実行するとなぜ機能しないのでしょうか?なぜ元のバイトが得られないのか?私はそのオーディーのために仮定する? – WickSec

+0

もしそうなら、私にコードの例を教えてもらえますか? – WickSec

+0

私はあなたに理由を言った。これはisBitSet()で異なるビットを検索し、次にあなたの関数で変更するためです –

関連する問題