Другие языки программирования и технологии
Вопрос по Си
Добрый день всем. Имеется код, который меняется местами первый и последний байты: 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 - выделяем маской с единицами в двух средних байтах два средних байта
... | ...| ...-объединяем все полученное наложением
Просто надо понимать двоичную и шестнадцатиричную системы счисления. А круглые скобки, кстати, не нужны, и без них бы работало.
dword >> 24 - сдвигаем на 3 байта вправо, старший байт становится младшим, остальные нулями
dword & 0x00FFFF00 - выделяем маской с единицами в двух средних байтах два средних байта
... | ...| ...-объединяем все полученное наложением
Просто надо понимать двоичную и шестнадцатиричную системы счисления. А круглые скобки, кстати, не нужны, и без них бы работало.
пример на асме
если правильно переписал алгоритм (надеюсь кто нить поправит еслив чё)
посмотреть выполнения и все манипуляции с числом можно в дебагере например 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
если правильно переписал алгоритм (надеюсь кто нить поправит еслив чё)
посмотреть выполнения и все манипуляции с числом можно в дебагере например 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
Похожие вопросы
- Вопрос от начинающего ))) Список вопросов (питон, Си и в принципе работа ПК) (Мало что понимаю)
- простенький вопрос по Си....
- Вопрос по СИ (внутри)
- вопрос по си
- Вопрос по Си. if ((i++)==10) и i++ if (i==10) будет ли первый пример работать быстрее чем второй?
- Народ, помогите, по вопросу языка СИ, команды fgets!
- Вопрос про компиляторов ЯП Си..
- Разница между Си и Си++
- Как из си++ сделать си?)... подробнее
- Какие преимущества сохранил Ассемблер к Си?