Битовый сдвиг (вращение) с шестнадцатеричным числом в C [дубликат]

Я пытаюсь повернуть шестнадцатеричные числа в 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

Спасибо за помощь.

# hex byte-shifting
Источник
  • 4
    Да, это то, что делает сдвиг влево.
  • 1
    Вы, может быть, пытаетесь вращать биты? В противном случае ваш код делает именно то, что должен делать.
  • 0
    Ах да, спасибо, я пытаюсь их повернуть. Я должен был это прояснить.
  • 0
    @TimonDoo Почему код имеет ширину 4 в 0x%04x ? Вы хотели 8 вместо 8 шестнадцатеричных цифр?
Codelisting
за 3 против
Лучший ответ

Нет оператора, который выполняет вращение за вас. Вам нужно совместить 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;
}
  • 0
    Если она есть на вашей платформе, самым простым способом (хотя и не стандартным C) может быть просто использование встроенной сборки и соответствующей инструкции поворота.
  • 0
    Привет, спасибо за ваш ответ, я новичок в C и не знаю значений без знака, но я проверяю это
за 1 против

Когда вы используете левый 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 с.

Codelisting
Популярные категории
На заметку программисту