2010-11-21 15 views
1

私は、符号なしchar配列へのポインタを持っています。 unsigned char *uc_array。アドレスが指し示すコンテンツを8ビット右にシフトすると、uc_array + 1になりますか?Cビット操作char配列

+0

注:OPの 'uc_array ++ 'を' uc_array + 1'に変更しました。 –

答えて

3

コンテンツをシフトすると、値が変更され、メモリ内では移動されません。

+0

彼らは 'uc_array ++'にありますが(post inc)です。 –

0

ありません....もしあればあなたは、ポインタが指しているものの値をインクリメントしている*uc_array++ポインター逆参照。しかし、これを行うと、uc_array++は、*uc_arrayによって返された「隣の隣接値」を指すポインターのアドレスをインクリメントしています。使用のプラットフォームとコンパイラに依存

は、そのポインタ演算は、ポインタのタイプサイズに依存していることを忘れないでください、文字ポインタのために、それは、int型のため、1ですその4 ...

0

memmove(uc_array + 1, uc_array, bytesize_of_array); 

として解釈するとき、あなたの質問にのみ、私はあなたが8ビットバイトのプラットフォーム上にあると仮定し、かつシフトすることによって、あなたが長いbit-として解釈する際のビットをシフトする意味あることだ私には理にかなっています連続したバイトのシーケンスシフトの説明のために配列の後のchar)。そして実際にアドレスuc_arrayに格納された値はuc_array + 1に格納されます。しかし

あなたはこの

for(unsigned char *x = uc_array; x != uc_array + byte_count; ++x) 
    *x >>= 8; 

のようなループを行うと、あなただけのバイトのバイトは、すべてのビットを離れてシフトし、そこにすべてを無効にします8ビットバイトを仮定した場合。

0

いいえ値の変更は、その値にのみ影響し、隣接値には影響しません。これにはシフト演算子が含まれます。

シフト演算子によってシフトアウトされたビットは "失われています"。

0

データをシフトする方法によって異なります。これ(quint16)(* uc_array)>> 8のようなことをすれば、最初のバイトは2番目のバイトに移動します。しかし、単に(* uc_array)>> 8を実行すると、他のものはあなたのデータを空にします。