Другие языки программирования и технологии

Вопрос по Си

Добрый день всем. Имеется код, который меняется местами первый и последний байты: int main() { unsigned int dword; scanf("%d",dword); dword = (dword << 24) | (dword & 0x00FFFF00) | (dword >> 24); printf("%d",dword); system("PAUSE"); return 0; } Объясните как проводятся операции? почему сдвигаем на 24 ? И что это "0x00FFFF00" ? И как бы почему в записи "х" ? Заранее спасибо
dword << 24 - сдвигаем на 3 байта (24 бита) влево, младший байт становится старшим, остальные нулями
dword >> 24 - сдвигаем на 3 байта вправо, старший байт становится младшим, остальные нулями
dword & 0x00FFFF00 - выделяем маской с единицами в двух средних байтах два средних байта
... | ...| ...-объединяем все полученное наложением
Просто надо понимать двоичную и шестнадцатиричную системы счисления. А круглые скобки, кстати, не нужны, и без них бы работало.
Stas Petkun
Stas Petkun
32 266
Лучший ответ
пример на асме
если правильно переписал алгоритм (надеюсь кто нить поправит еслив чё)
посмотреть выполнения и все манипуляции с числом можно в дебагере например ollydbg // клавишами F7 - F8 // при этом обратив внимания на регистры и на дамп памяти

пример для fasm

format PE console
entry WINMAIN
include 'c:\fasm\include\win32a.inc'
section '.code' code readable executable
proc WINMAIN hInst, hprevinstance, lpcmdline, ncmdshow
mov eax,[chislo]
shl eax,24
mov [step1],eax

mov eax,[chislo]
and ebx,00FFFF00h
mov [step2],eax

mov eax,[chislo]
shr eax,24
mov [step3],eax

mov eax,[step1]
mov ebx,[step2]
mov edx,[step3]

xor eax,ebx
xor eax,edx

mov [_out],eax
invoke ExitProcess,0
endp
section '.data' data readable writeable

chislo dd 7754
step1 dd ?
step2 dd ?
step3 dd ?
_out dd ?
section '.idata' import data readable writeable
library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL'
include 'c:\fasm\include\api\kernel32.inc'
include 'c:\fasm\include\api\user32.inc'
===
на входе
00001E4A
на выходе
4A001E4A
(Bbg) Сергей
(Bbg) Сергей
3 181