2016-07-08 8 views
-4

興味深い質問があります。私は列に基づいてバイトを返す関数を作成する必要がありバイト配列、それを90度回転させる必要があります。

{B10000000, 
B00000000, 
B10000000, 
B00000000, 
B10000000, 
B00000000, 
B10000000, 
B00000000} 

: 私はこのようになりますuint8_t配列を持っています。

ここ
row(0) = B10101010 
row(1) = B00000000 
etc 

上記の配列については、例えば は、私がこれまで

static uint8_t column = B00000001; 
    static uint8_t k = 0; 

    static uint8_t factor[7]; 
    static uint8_t rows[7]; 
    rows[k] = 0; 

    for(int i=0;i<8;i++){ 
    factor[i] = led[i] & column; 
    factor[i] >>= k; 
    factor[i] <<= i; 
    rows[k] += factor[i]; 
    } 

    if (k < 7) { 
    column = column << 1; 
    k = k + 1; 
    } 
    else { 
    column = B00000001; 
    k = 0; 
    } 
} 

それを行っている。しかし、それは私のためにうまく機能していない方法です。何か案は?

編集:私の悪い。ちょうどこれを編集:

static uint8_t factor[8]; 
    static uint8_t rows[8]; 

私はちょうどそれをミラーリングする方法を理解する必要があり、私は完了です。

+0

私は私たちに*ソースコードを表示...ここには '10101010'を見ていない。* –

+0

私は、「C++のビットマップローテーションビット」をインターネットで検索をお勧めします。 –

+0

...列が表示されません。 – PcAF

答えて

0

理解を容易にするため、のビットのマトリクスを考える:

0110 0101 
1010 0001 
1100 1100 
0101 0101 

マトリックス用回転アルゴリズムは関係なく、その内形と同一です。
上記のマトリックスには、8列のビット、4行があります。

大きな違いは、個々のビットにアクセスすることです。
ビット(行アドレス、列アドレス)と(バイトアドレス、ビットオフセット)の間の何らかの変換が必要です。

[1] linear_offset = row * maximum_columns + column; 

我々は同様の式をしたいと思いますが、ビットとバイトのために:

は、我々は式を使用して1次元配列にそれらを絞ることができ、整数行列を使用して知っています。

一次元のみを使用して、我々は、バイトを計算することができるによってビットオフセット:

unsigned int byte_offset = column/(BITS_PER_BYTE); 
unsigned int bit_offset = column % (BITS_PER_BYTE); 

は、式[1]によれば、オフセット線形行を必要とします。私たちの場合、1行あたりのバイト数を計算する必要があります。 1行あたりのバイト数は、1行あたりの最大列数に依存します。我々が持っているので:

unsigned int linear_byte_offset = row * ((MAXIMUM_COLUMNS + BITS_PER_BYTE - 1)/BITES_PER_BYTE) + byte_offset; 

をビットを変更するには:

// Clear the bit 
byte = byte & (~(1 << bit_offset)); 
// Then set the bit 
byte = byte | (1 << bit_offset); 

上記のアルゴリズムでは、我々は、マトリックス内の任意のビット位置を読み、その行と列を参照することにより、任意のビット位置に書き込むことができます縦座標。

これは、行と列の配置(縦座標)を使用する回転アルゴリズムを使用できることを意味します。回転アルゴリズムのようなものである。

残りのアルゴリズムは、OPの練習問題として残しています。

(注:一般的な行列回転アルゴリズムを使用するよりも効率的な90度回転の場合、特殊なコードを書くことができます)。

関連する問題