циклический сдвиг битов вправо

163
14 августа 2021, 14:40

Ниже представлен рабочий код, но почему-то выводятся лишние нули после D. Объясните почему так происходит?

#include <stdio.h>
int ror(int a, int n)
{
  int t1, t2;
  n = n % (sizeof(a)*8);  // нормализуем n
  t1 = a >> n;   // двигаем а влево на n бит, теряя младшие биты
  t2 = a << (sizeof(a)*8 - n); // перегоняем младшие биты в старшие
  return t1 | t2;  // объединяем старшие и младшие биты
}
int main()
{
    printf("%x", ror(0xFFAD, 4));
    return 0;
}

Console output:

ad0000ff
Answer 1
int ror(int a, int n)

Тип int - это 32битное число. 32 бита это 4 байта, 4 байта - 8 символов в 16ричной системе. То есть передавая в функцию 0xFFAD вы на самом деле передаете 0x0000FFAD, и сдвигая на 4 бита получаете 0xAD0000FF. Ваша функция работает правильно

Если вы хотите именно 16битные числа смещать - измените тип параметра на short, получите то что вы ожидали. Если нули в начале должны игнорироваться - придется модифицировать функцию

READ ALSO
C++, вопрос про безопасность offsetof

C++, вопрос про безопасность offsetof

Я бы хотел прояснить следующий момент

124
Почему-то не создается окно в ImGui

Почему-то не создается окно в ImGui

Почему-то не создается окноЯ новичок в ImGui

145
Развернуть свернутое окно

Развернуть свернутое окно

Как можно средствами C++ развернуть свернутую программу и сделать её окно активным?

91
C++ и ссылки &amp;&amp;

C++ и ссылки &&

Я бы хотел разобраться в том, для чего именно в Стандарт C++ были добавлены ссылки &&Какие именно проблемы решает это нововведение?

229