2016-09-30 5 views
2

これは私が楽しみにしたかったものです。Cロールバックする方法

セイは、例えば、私は私が1バイト以上の4つの最上位バイトのシフトを意味0xDDEAAAAA

に値を変換することができるようにしたい0xDEADAAAA

を入力してください。 そして、4番目の最上位バイトが最初の最上位バイトになります。

最初の4バイトのような種類の循環シフトがあります。今、私はこれは、1バイトの上にすべてのバイトをシフトします

value = value >> ((sizeof(unsigned int) * 8)/2); 

をやっているために

。 しかし、4番目の重要なバイトの循環ロールをMSBにどのようにして入れますか?

+0

文字列には「最上位バイト」がありません。そして、それが整数であると想定されている場合、それは4バイトしかないようです。あなたが何を意味するのかははっきりしない。 [ask]を参照し、[mcve]を提供してください。あまりにも多くの質問がない場合は、 "c演算子"を検索します。 – Olaf

+2

[Bit Twiddling Hacks](http://graphics.stanford.edu/~seander/bithacks.html)を参照してください。下位バイトをそのままにして上位4バイトをローテートする必要があります(ただし、下位バイトに値AAAAを指定すると、バイト値を保持する誤った変更を検出することは難しく、 '0xDEAD0123'などを使用します)。また、あなたはバイトをnybblesと混在させているように見えます;各16進数字はナイブル(別名ニブル)であり、あなたは4つの最も重要なニブルを扱いたいと思われます。バイト。 –

+0

これは文字列ではない符号なし整数です。私は読みやすさのために16進数で表現しています。 – momonkey7

答えて

3

番号を3つの部分に分割し、別々に処理してから組み合わせることができます。

変更されていない部分はvalue & 0x0000FFFFです。
右に4ビットシフトしたい部分はvalue & 0xFFF00000です。
シフトしたい部分が12ビット左にあるのはvalue & 0x000F0000です。

ので、それらのもののすべてを行う、その後|で結果を結合:

value = (value & 0x0000FFFF) 
     | ((value & 0x000F0000) << 12) 
     | ((value & 0xFFF00000) >> 4); 

(それが参照するのは簡単ですので、私はすべてのマスクを並んでましたが、明らかにあなたが持っていないここで、注意してくださいこれを行うには

関連する問題