符号なしの文字の配列をバイナリで右にシフトしようとしています。配列を右にシフトする1
例:0000 0000 |私が8回シフトする0000 1111は私に0000 1111 | 1111 1111(バイナリの左シフト)
だから私のアレイにIが得る:{0x0Fの、0x00で、0x00に、0x00を} => {0xFFで、0x0Fの、0x00に、0x00の}(配列で右シフト)
私は現在、これは関数MEMMOVE使用してあります。
unsigned char * dataBuffer = {0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned int shift = 4;
unsigned length = 8;
memmove(dataBuffer, dataBuffer - shift, length + shift);
for(int i = 0 ; i < 8 ; i++) printf("0x%X ", dataBuffer[i]);
Output: 0x0 0x0 0x0 0x0 0xF 0x0 0x0 0x0
Expected output: 0xFF 0x0 0x0 0x0 0x0 0x0 0x0 0x0
あなたが見ることができるように、私は要素によって、私の配列要素のみをシフトするために管理し、私は私が使用していることを推測する1と0交換する方法がわかりませんmemsetは動作するかもしれませんが、正しく使用することはできません。
ありがとうございました!
EDIT:exFATディスクのビットマップゾーンを埋めるためです。ディスクにクラスタを書き込むときは、ビットマップの対応するビットを1(最初のクラスタは最初のビット、2番目のクラスタは2番目のビット、...)に設定する必要があります。
提案の例では、私は8つのクラスタを書いた場合、私は値を8回シフトし、1 でそれを埋めるために必要があります私のニーズに対応して、新たにフォーマットされたドライブは、ビットマップの最初のバイトに0x0Fに含まれます
コードでは、4クラスタを書き込んで4ビットシフトする必要がありますが、4バイトシフトします。
解決策として質問を設定すると、私がしたいことはできません。配列のビットをシフトする代わりに、配列の各バイトを別々にシフトする必要があります。
:
はCLIB
memset
魔法を再利用することができます問題を述べる。彼らはどのように見えるのですか?入力と出力?期待される行動は正確には何ですか?あなたは一例を挙げましたが、あなたの要件を本当にカバーしていますか?何のためにそれが必要ですか? – ElyasinexFATディスクのビットマップゾーンを埋めるためです。ディスクにクラスタを書き込むときは、ビットマップの対応するビットを1(最初のクラスタは最初のビット、2番目のクラスタは2番目のビット、...)に設定する必要があります。 ビットマップの最初のバイトに0x0Fが新しくフォーマットされたドライブに格納されるので、8つのクラスタを書き込む場合、提案した例が私のニーズに対応します。値を8回シフトして1にする必要があります。 –
シフトはしません 'ここでは意味をなさない - まず、書き込みを行っているクラスターを選択しているが、シフトを伴わないクラスターは、書き込み中のクラスターに対応するビットを設定するだけである(それらは連続していない可能性がある)。 2番目の例では、右にシフトしていることを示していますが、通常のビットシフトの反対である0ではなく1でパディングしています。ビットシフトするには、<< and >>ビットレベルの演算子を使用して行います。シフトする際に使用する任意のワードサイズでオーバフローを管理します。しかし、あなたの説明に基づいて、それはあなたが本当に望むようには聞こえません。 –