2012-04-28 25 views
9

ビット単位で右にシフトしようとしている文字配列があります>>、次に&を別の配列に置き換えます。私はこれをどうやって行うのか間違っていると思う。charのビット単位シフト配列

私はそれだけでmy_array >>= 1を述べ文字の配列はすべてをシフトするだろうが、私はエラーを取得していたにも関わらず、思った:"error: invalid operands to binary >> (have ‘char[8]’ and ‘int’)"

私がやろうとしていますビット単位の比較ですが、すべてに開始似たサイズの配列であります"0"の...私はそれを得る:"error: invalid operands to binary & (have ‘char *’ and ‘char *’)"

私はシフトと比較する前に、これらの配列を別のものに変換する必要がありますか?

申し訳ありませんが、私は非常に明確ではありませんでした...この時点までのすべての素晴らしいアドバイスと私はこれを行うための超簡単な方法はないことをより理解していると思います。具体的には、私がやろうとしているのは、WHOLE char配列right1のビットを右にシフトして、配列の左端にシフトされたビットを追加し、同じサイズの別の配列とビット単位で比較します。

技術的には、配列を配列にする必要はありません。ビットが必要です。シフト/比較を実行する前に配列を別のものに変換する方が簡単でしょうか?

+2

配列の内容を回転しようとしていますか、配列の各要素をビット単位でシフトしようとしていますか?これらの操作はネイティブにCには存在しません。各要素を1つの場所にコピーするか、ビット単位で配列の各要素をシフトするループを作成する必要があります。 – chrisaycock

答えて

10

あなたは要素ごとにシフトして比較することがあります。

for(i = 0; i < len; ++i) 
    array[i] >>= 3; 

たとえば、あなたはビットが、それはより複雑ですが、次の1つの要素からシフト移動したい場合は、次のビットを必要とするので、あなたが他の方向に配列を横断した後、

unsigned char bits1 = 0, bits2 = 0; 
for(i = len-1; i >= 0; --i) { 
    bits2 = array[i] & 0x07; 
    array[i] >>= 3; 
    array[i] |= bits1 << 5; 
    bits1 = bits2; 
} 

を右シフトしていると言いますより高いスロット。

2

アレイのエントリを1つずつシフトする必要があります。 (そして、2つの要素を比較したい場合は要素ごとに要素を行う必要があります)

各文字からシフトされたビットが次の要素にシフトすることを期待していたら、手動でもそれを処理してください。

コードを厄介で移植性がなく、バグが発生しやすいようにしたい場合は、配列へのポインタをキャストしてキャストすることができますunsigned long long *のようなものに逆参照し、結果の整数をシフトして、それを再び保存します。

しかし、それが必要な場合は、最初にchar[8]の代わりに整数を使用する必要があります。

(あなたが実際に達成することを目指しているものについての詳細を言うことができる場合は、より多くの有用な答えが可能かもしれない。)

2

配列のシフト/ OR/XOR/AND/etc ..などの操作を実行する場合は、ループで実行する必要があります。配列で直接実行することはできません。

2

その配列のメンバであるchar(またはint)だけをシフトできます。配列全体を移動することはできません。 my_arrayは、不可能な配列型(またはcharへのポインタ)に対してシフト操作を実行しようとします。左の代わりに、ゼロから

for (i = 0; i < size; i++) { 
    my_array[i] >>= 1; 
} 

また、彼らは通常、署名されているので、あなたが文字で注意しなければならない、と負の値を含む文字がもたらす「1」:代わりにこれを行います。だからあなたはunsigned charsを使うのが良い。

編集: 上記のコードは単純です。それぞれのバイトだけでなく、配列全体を右にシフトする場合は、各LSBを右にあるバイトのMSBに「手動で」コピーする必要があります。 Richard Penningtonの答えでループを起こしてください。

+0

私は彼が配列を単一の値として扱いたいと思うと思いますので、より重要なバイトから少しでも運ぶ必要があります。 – loganfsmyth

+0

私は自分の答えを編集しました。ありがとう –

3
/** Shift an array right. 
* @param ar The array to shift. 
* @param size The number of array elements. 
* @param shift The number of bits to shift. 
*/ 
void shift_right(unsigned char *ar, int size, int shift) 
{ 
    int carry = 0;        // Clear the initial carry bit. 
    while (shift--) {       // For each bit to shift ... 
     for (int i = size - 1; i >= 0; --i) { // For each element of the array from high to low ... 
      int next = (ar[i] & 1) ? 0x80 : 0; // ... if the low bit is set, set the carry bit. 
      ar[i] = carry | (ar[i] >> 1);  // Shift the element one bit left and addthe old carry. 
      carry = next;      // Remember the old carry for next time. 
     } 
    } 
} 
+0

これは奇妙に見える、または私は何かが不足しています。右シフトと左シフトの組み合わせのように見えます。キャリービットの隣のコメントには、 "要素を1ビット左にシフト"と表示されますが、右にシフトします。そして、forループが高いから低いへ行く、私はむしろ右にシフトするために低いから高いへ行くだろう。 –

+0

また、 "int carry = 0;"を移動します。 forループの直前のwhileループの内側にあります。 –

関連する問題