2016-09-30 2 views
2

Dies ist nur etwas, das ich zum Spaß machen wollte, keine echte praktische Verwendung davon.C wie man Bytes byte

Sagen Sie zum Beispiel gebe ich 0xDEADAAAA

Ich mag den Wert in 0xDDEAAAAA zu transformieren können

Bedeutung der 4 höchstwertigen Bytes über einen Byte verschieben. Und das 4. höchstwertige Byte wird jetzt zum ersten höchstwertigen Byte.

Wie eine zirkuläre Verschiebung der ersten 4 Bytes.

Vorerst Diese

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

tun werden alle Bytes über ein Byte verschiebe ich bin. Aber wie würde ich die zirkuläre Roll des 4. höchstwertigen Bytes in das MSB tun?

+0

Ein String hat kein "höchstwertiges Byte". Und wenn das eine ganze Zahl sein soll: Es scheint nur 4 Bytes zu haben. Es ist nicht klar, was du meinst. Siehe [fragen], stellen Sie ein [mcve] bereit. Und suche nach "c-Operatoren", wenn das nicht zu gefragt ist. – Olaf

+2

Siehe [Bit Twiddling Hacks] (http://graphics.stanford.edu/~seander/bithacks.html). Sie müssen 4 höherwertige Bytes rotieren lassen, während die Low-Einsen unverändert bleiben (obwohl mit dem Wert AAAA in den niederwertigen Bytes es schwierig sein wird, fehlerhafte Änderungen zu finden, die Bytewerte erhalten, verwenden Sie '0xDEAD0123' oder etwas anderes mit deutliche Bytes im niederwertigen Teil des Wertes, außerdem scheinen Sie Bytes mit Nybles zu verwechseln, jede Hexadezimalzahl ist ein Nybble (aka Nibble), und es scheint, dass Sie sich mit den 4 höchstwertigen Nybles beschäftigen wollen, nicht –

+0

Es ist ein vorzeichenloser Integer, kein String, ich stelle ihn nur zur besseren Lesbarkeit in Hexadezimal dar. – momonkey7

Antwort

3

Sie können die Nummer in drei Teile aufteilen und separat verarbeiten und dann kombinieren.

Der Teil, der unverändert ist, ist value & 0x0000FFFF.
Der Teil, den Sie 4 Bits richtig verschieben möchten, ist value & 0xFFF00000.
Der Teil, den Sie nach links 12 Bits verschieben möchten, ist value & 0x000F0000.

So tun all diese Dinge, verbinden dann die Ergebnisse mit |:

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

(Note, hier habe ich alle Masken aufgereiht so ist es leicht zu sehen, aber offensichtlich haben Sie nicht um das zu tun)

Verwandte Themen