Задача на освоение битовых операций - C (СИ)
Формулировка задачи:
Задача: подается число типа int, необходимо вывести его двоичное представление на экран и осуществить арифметический сдвиг вправо каждого байта этого числа на количество содержащихся в нем(байте) нулевых битов, вывести преобразованное число на экран.
Помогите, плиз, сам пытался разобраться, но не врубаюсь вообще.
Решение задачи: «Задача на освоение битовых операций»
textual
Листинг программы
#include <stdio.h>
void print_byte_binary(char b)
{
char buf[9];
int i=7;
for (i=7; i>=0; i--)
{
buf[i] = '0' + (b & 1);
b >>= 1;
}
buf[8] = '\0';
printf("%s", buf);
}
void print_int_binary(int x)
{
size_t i;
char *data = &x;
for (i = sizeof(int); i > 0; i--)
{
print_byte_binary(data[i-1]);
printf(" ");
}
puts("");
}
size_t numberOfZeros(char x)
{
size_t n = 0;
int i = 8;
while (i --> 0)
{
if ( !(x & 1) ) ++n;
x >>= 1;
}
return n;
}
void rotateInt(int *x)
{
char *p = x;
size_t i = sizeof(int);
while (i --> 0)
{
*(p+i) >>= numberOfZeros(*(p+i));
}
}
int main()
{
int x = 0xDF5F8FA7;
print_int_binary(x);
rotateInt(&x);
print_int_binary(x);
return 0;
}
Объяснение кода листинга программы
- Объявление функции print_byte_binary, которая преобразует байт в двоичное представление и выводит его на экран.
- Объявление функции print_int_binary, которая преобразует целое число в двоичное представление и выводит его на экран.
- Объявление функции numberOfZeros, которая считает количество нулей в двоичном представлении числа.
- Объявление функции rotateInt, которая поворачивает двоичное представление числа влево на заданное количество позиций.
- В функции main создается переменная x со значением 0xDF5F8FA7.
- Вызывается функция print_int_binary для вывода двоичного представления числа x.
- Вызывается функция rotateInt для поворота двоичного представления числа x влево.
- Вызывается функция print_int_binary для вывода измененного двоичного представления числа x.
- Функция main возвращает 0, завершая работу программы.