Я пытаюсь повернуть шестнадцатеричные числа в C. У меня проблема в том, что с каждым циклом. в номере появляется больше нулей.
Вот мой код:
int main (void) {
int hex = 0x1234ABCD;
for(int i=0; i<12;i++,hex <<=4){
printf("0x%04x %d ",hex,hex );
pattern(hex);
}
return 0;
}
Я видел на этом сайте другой код, который добавлял & 0x0F к смене, но у меня он не работает.
Вот мои результаты с компилятором
0x1234abcd 305441741 0001 0010 0011 0100 1010 1011 1100 1101
0x234abcd0 592100560 0010 0011 0100 1010 1011 1100 1101 0000
0x34abcd00 883674368 0011 0100 1010 1011 1100 1101 0000 0000
0x4abcd000 1253888000 0100 1010 1011 1100 1101 0000 0000 0000
0xabcd0000 -1412628480 1010 1011 1100 1101 0000 0000 0000 0000
Спасибо за помощь.
Нет оператора, который выполняет вращение за вас. Вам нужно совместить 2 сменные операции. Также вы должны использовать беззнаковые значения при выполнении операций с битовым сдвигом.
int main (void) {
unsigned int hex = 0x1234ABCD;
for(int i=0; i<12;i++) {
printf("0x%04x %d ",hex,hex );
pattern(hex);
unsigned int upper = hex >> (sizeof(hex)*CHAR_BIT - 4);
hex <<= 4;
hex |= upper & 0x0F;
}
return 0;
}
Когда вы используете левый Shift (<<
) над числом, сдвигаясь на n битов, то наиболее значимые n бит этого числа теряются, а младшие n битов заполняются нулями (как вы заметили).
Итак, чтобы выполнить побитовое вращение , вам нужно сначала «сохранить» эти верхние 4 бита, а затем вернуть их (используя|
оператор, переместив их вниз).
Итак, если предположить, что 32-битныйint
размер, примерно так:
#include <stdio.h>
int main(void)
{
int hex = 0x1234ABCD;
for (int i = 0; i < 12; i++) {
printf("0x%04x %d ", hex, hex);
pattern(hex);
int save = (hex >> 28) & 0x0F; // Save TOP four bits of "hex" in BOTTOM 4 of "save"
hex <<= 4; // Now shift the bits to the left ...
hex |= save; // ... then put those saved bits in!
}
return 0;
}
Примечание: мы маскируемsave
значение с0x0F
после сдвига, чтобы убедиться, что все остальные биты0
; если мы этого не сделаем, то с отрицательными числами мы, вероятно, получим эти другие биты, заполненные1
с.
0x%04x
? Вы хотели 8 вместо 8 шестнадцатеричных цифр? chux - Reinstate Monica