2012-03-21 18 views
2

私は赤の1バイト、緑の1バイト、青の1バイトをとる方法があり、赤のバイトの最後の3ビットを抽出すると、緑のバイトの最後の2ビットと青のバイトの最後の3ビットは、どのように私はこれを達成するだろうか?私は以下のコードを使用していましたが、完全には機能していません。私はここで間違って何をしていますか?バイトから値を取得する

private const byte InverseBlueMask = 7; // 00000111 
    private const byte InverseGreenMask = 3; // 00000011 
    private const byte InverseRedMask = 7; // 00000111 

    //private const byte InverseBValueMask = 31; // 00011111 
    //private const byte InverseGValueMask = 231; // 11100111 
    //private const byte InverseRValueMask = 248; // 11111000 



    public void getEachBitOfMessage(byte byteToManipulate, int colour) 
    { 
     byte value = 0; 
     byte returnByte = 0; 


     if (colour == BLUE) 
     { 
      value = (byte)(byteToManipulate | BValueMask); 
      value = (byte)(value >> 5); 
      returnByte = (byte)(byteToManipulate | InverseBlueMask); 
      returnByte = (byte)(returnByte & value); 
      String theByte = returnByte.ToString(); 

     } 
     else if (colour == GREEN) 
     { 
      value = (byte)(byteToManipulate | GValueMask); 
      value = (byte)(value >> 3); 
      returnByte = (byte)(byteToManipulate | InverseGreenMask); 
      returnByte = (byte)(returnByte & value); 
      String theByte = returnByte.ToString(); 

     } 
     else if (colour == RED) 
     { 
      value = (byte)(byteToManipulate | RValueMask); 
      returnByte = (byte)(byteToManipulate | InverseRedMask); 
      returnByte = (byte)(returnByte & value); 
      String theByte = returnByte.ToString(); 

     } 
    } 

これはiは色の各バイトにメッセージのビットを置くために使用する方法です。

private const byte BlueMask = 248; // 11111000 
    private const byte GreenMask = 252; // 11111100 
    private const byte RedMask = 248; // 11111000 
    private const byte BValueMask = 224; // 11100000 
    private const byte GValueMask = 24; // 00011000 
    private const byte RValueMask = 7; // 00000111 



    public byte changeEachBit(byte byteToManipulate, int colour, byte theMessage) 
    { 

     byte value = 0; 
     byte returnByte = 0; 

     if (colour == BLUE) 
     { 
      value= (byte)(theMessage & BValueMask); 
      value = (byte)(value >> 5); 
      returnByte = (byte)(byteToManipulate & BlueMask); 
      returnByte = (byte)(returnByte | value); 

     } 
     else if (colour == GREEN) 
     { 
      value = (byte)(theMessage & GValueMask); 
      value = (byte)(value >> 3); 
      returnByte = (byte)(byteToManipulate & GreenMask); 
      returnByte = (byte)(returnByte | value); 

     } 
     else if (colour == RED) 
     { 
      value = (byte)(theMessage & RValueMask); 
      returnByte = (byte)(byteToManipulate & RedMask); 
      returnByte = (byte)(returnByte | value); 

     } 
    } 
+3

ジャスト提案:ビットマスクは六角で読むことがはるかに簡単です。 – John3136

+0

私はまだ混乱していますが、私の答えは正しいと思います。赤(たとえば上記の2つ)を取得するには、red = someValと0x07を使用します。真剣に:あなたが他人にしていることを説明しようとすると、あなたはその問題を見つけるのを助けるかもしれません。これまでの説明は、ビット操作における些細な練習であるはずのものにとって、大変複雑なようです。 – John3136

答えて

1

これは動作します。..

private const byte InverseBlueMask = 7; // 00000111 
    private const byte InverseGreenMask = 3; // 00000011 
    private const byte InverseRedMask = 7; // 00000111 

    public void getEachBitOfMessage(byte byteToManipulate, int colour) 
    { 
     byte value = 0; 

     if (countToByte == 3) 
     { 
      byte blueAreaInTotal = 0; 
      byte greenAreaInTotal = 0; 
      byte redAreaInTotal = 0; 
      byte total = 0; 

      redAreaInTotal = (byte)(redCount); 
      blueAreaInTotal = (byte)(blueCount << 5); 
      greenAreaInTotal = (byte)(greenCount << 3); 

      total = (byte)(total | redAreaInTotal); 
      total = (byte)(total | blueAreaInTotal); 
      total = (byte)(total | greenAreaInTotal); 
      convertToChar(total); 

      redCount = 0; 
      blueCount = 0; 
      greenCount = 0; 
      countToByte = 0; 
     } 

     if (colour == BLUE) 
     { 
      value = (byte)(byteToManipulate & InverseBlueMask); 
      blueCount = value; 
     } 
     else if (colour == GREEN) 
     { 
      value = (byte)(byteToManipulate & InverseGreenMask); 
      greenCount = value; 

     } 
     else if (colour == RED) 
     { 
      value = (byte)(byteToManipulate & InverseRedMask); 
      redCount = value; 
     } 

     countToByte++; 
    } 
0
private const byte BValueMask = 224; // 11100000 

/* ... */ 

    if (colour == BLUE) 
    { 
     value = (byte)(byteToManipulate | BValueMask); 
     value = (byte)(value >> 5); 

ここで効果は上位3ビットをオンにして、下位5ビットを捨てることです。次のように書いてください:value = 7;。おそらく、これらの3つのステートメントは、異なるマスクを使用することを意図したものか、別のビット操作を使用することを意図したものでしょうか?各バイトから

+1

ORというよりANDを使用するように見えます。 –

+0

もちろん、これらのビットはシフト中に破棄されます。 –

2

iは赤バイトの最後の3ビット、緑のバイトの最後の2 ビット及び青色のバイトの最後の3ビットを、どのようにこれを達成 希望を抽出しますか?

これは、要求した下位nビット以外のすべてをマスクします。

red &= 0x07; 
green &= 0x03; 
blue &= 0x07; 
+0

hmm ...これは私にランダムな値を与えているように見えますが、私が戻ってくるものはまったくありません。私は適切なバイトに値を書いているのですか? – BigBug

+0

青と赤で0-7、緑で0-3の間のランダムな値? – John3136

+0

umm ...例えば、私がイメージに入れた文字列は "2008"です。ですから、私は赤の1バイトから緑の1バイトと青の1バイトを収集することを期待しています最初のラウンドで値 "2" ...しかし、赤= "2"、緑= "2"、青= "1" ... – BigBug

関連する問題