Schnelles vertauschen von Bytes?
-
Hi,
ich habe folgendes Problem: Ich muß Bytes vertauschen, das geht auch wunderbar mit bitshifts! Aber leider benötige ich dafür 5 casts

Hier mein Code:
unsigned long value_old = create_color (255, 128, 64, 32); unsigned long value_new = create_color (static_cast<unsigned char>(value >> 0), static_cast<unsigned char>(value >> 8), static_cast<unsigned char>(value >> 16), static_cast<unsigned char>(value >> 24));Das klappt 1a! Nur ist wegen den 5 Casts relativ "unschön" und auch nicht flott zur Laufzeit.
Wie kann man das verbessern?! Also ohne casts und mehr power?

mfg!
-
sorry, funktion noch vergessen!
unsigned long create_color (unsigned char a, unsigned char r, unsigned char g, unsigned char b) { return (static_cast<unsigned long>((a << 24)|(r << 16)|(g << 8)|(b))); }
-
Hallo
und auch nicht flott zur Laufzeit
static_cast haben keinen Einfluß zur Laufzeit, sondern werden komplett zur Compiletime ausgewertet. Das verwechselst du mit dynamic_cast.
bis bald
akari
-
akari schrieb:
Hallo
und auch nicht flott zur Laufzeit
static_cast haben keinen Einfluß zur Laufzeit, sondern werden komplett zur Compiletime ausgewertet. Das verwechselst du mit dynamic_cast.
bis bald
akarikomisch, also mein GCC und Profiler sagen da aber ganz was anderes?! Je mehr casts ich reinstopfe, desto lamer wird das teil!
-
Hallo
das hat dann aber nichts mit den casts an sich zu tun, denn die sagen dem Compiler ja nur das er den einen Byteblock mit einem anderen Typ ansprechen soll. Und zur Laufzeit kennt C++ ja ohne RTTI ja dann keine Typen mehr.
Statt den Shifts kannst du besser Bitmasken benutzen, um bestimme Bits zu bekommen.
bis bald
kari
-
ich habe folgendes mal gemacht, doch da kommt nur 0 raus, warum?
(value) = ((value) >> 8) | ((value) << 8) & 0x00FF;
-
######### schrieb:
Hi,
ich habe folgendes Problem: Ich muß Bytes vertauschen, das geht auch wunderbar mit bitshifts! Aber leider benötige ich dafür 5 casts

Hier mein Code:
unsigned long value_old = create_color (255, 128, 64, 32); unsigned long value_new = create_color (static_cast<unsigned char>(value >> 0), static_cast<unsigned char>(value >> 8), static_cast<unsigned char>(value >> 16), static_cast<unsigned char>(value >> 24));Das klappt 1a! Nur ist wegen den 5 Casts relativ "unschön" und auch nicht flott zur Laufzeit.
Wie kann man das verbessern?! Also ohne casts und mehr power?

mfg!
Programmiere mit VC++ 8.0, wenn es schnell sein soll, nimmt man Assembler-Befehle mit rein!
unsigned long create_colorA(unsigned long value) { _asm mov eax, value // Byte-Order 1 2 3 4 _asm bswap eax // Byte-Order 4 3 2 1 } //Ergebnis in eax = return value; int main(void) { unsigned char test[] = {255, 128,64,32 }; unsigned long* value = reinterpret_cast<unsigned long*>(test); unsigned result1 = create_colorA(*value); unsigned long result2 = create_color(static_cast<unsigned char>(*value >> 0), static_cast<unsigned char>(*value >> 8), static_cast<unsigned char>(*value >> 16), static_cast<unsigned char>(*value >> 24)); return 0; }
-
Wenn wir Visual C++8.0 einsetzen, benutzen wir intrinsics (bzw. runtime funktionen, die auch eine intrinsic form haben) und sind so noch ganz nebenbei 64bit-kompatibel:
#if _MSC_VER >= 1300 #include <stdio.h> inline unsigned byte_swap(unsigned x) { return _byteswap_ulong( x ); } #elif defined __GNUC__ && defined __X86__ inline unsigned byte_swap(unsigned x) { __asm( "bswapl %0" : "=r" ( x ) : "0" ( x ) ); return x; } #else inline unsigned byte_swap(unsigned x) { return x >> 24 | ( ( x >> 8 ) & 0xff00 ) | ( ( x & 0xff00 ) << 8 ) | x << 24; } #endif
-
camper schrieb:
Wenn wir Visual C++8.0 einsetzen, benutzen wir intrinsics (bzw. runtime funktionen, die auch eine intrinsic form haben) und sind so noch ganz nebenbei 64bit-kompatibel:
#if _MSC_VER >= 1300 #include <stdio.h> inline unsigned byte_swap(unsigned x) { return _byteswap_ulong( x ); } #elif defined __GNUC__ && defined __X86__ inline unsigned byte_swap(unsigned x) { __asm( "bswapl %0" : "=r" ( x ) : "0" ( x ) ); return x; } #else inline unsigned byte_swap(unsigned x) { return x >> 24 | ( ( x >> 8 ) & 0xff00 ) | ( ( x & 0xff00 ) << 8 ) | x << 24; } #endifSo wie das da steht funktioniert es nicht mit VC++ 8.0, error C3861: "_byteswap_ulong": Bezeichner wurde nicht gefunden.

-
gerie schrieb:
So wie das da steht funktioniert es nicht mit VC++ 8.0, error C3861: "_byteswap_ulong": Bezeichner wurde nicht gefunden.

stiimt. muss <stdlib.h> sein.
-
