Заменить шестнадцатеричную цифру на количество единиц, имеющихся в ее двоичном представлении - C (СИ)
Формулировка задачи:
Дано короткое целое неотрицательное число. Заменить каждую входящую в его состав шестнадцатеричную цифру на количество единиц, имеющихся в ее двоичном представлении (например, цифру F надо заменить на 4).
Решение задачи: «Заменить шестнадцатеричную цифру на количество единиц, имеющихся в ее двоичном представлении»
textual
Листинг программы
#include <stdio.h>
#include <string.h>
int main()
{
const char *s = "4f5"; // задаём само число
int k, i, p = 0;
sscanf(s, "%x", &k); // переводим из 16-й строки в 16-е число
for(i = strlen(s)*4; i > 0; i--)
{
if(k & (1 << (i - 1)))
p++;
if((i - 1)%4 == 0) // 16-я цифра имеет размер 4 бита, поэтому я прохожу 4 бита, потом беру следующие
{
printf("%d", p); //печатаем кол-во едениц
p = 0;
}
}
puts("");
return 0;
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы для работы с I/O и строками
- Задаём само число в виде строки s =
4f5 - Объявляем переменные: k — для хранения шестнадцатеричного числа, i — счётчик циклов, p — счётчик единиц
- С помощью функции sscanf переводим строку в шестнадцатеричное число и сохраняем его в переменной k
- В цикле for перебираем биты числа, начиная с самого старшего (от большего к меньшему), используя размерность 4 бита для каждой цифры в числе
- Проверяем, есть ли единицы в текущем бите (k & (1 << (i — 1))) и если есть, увеличиваем счётчик p на 1
- При каждой итерации, когда проходит 4 бита (16-я цифра имеет размер 4 бита), выводим количество найденных единиц (p) и сбрасываем счётчик p в 0
- После завершения цикла выводим результат на экран с помощью функции puts
- Завершаем программу и возвращаем 0, чтобы указать, что программа успешно завершилась