Как вывести число в двоичном виде cи
Перейти к содержимому

Как вывести число в двоичном виде cи

  • автор:

Как сделать вывод чисел в двоичной системе счисления?

Как сделать вывод чисел в двоичной системе счисления?
Есть вектор с большим количеством чисел разной длинны. Необходимо их вывести в двоичной системе исчисления.
Был вариант с std::bitset, но там используется константа. Видел boost::dynamic_bitset, но это не stl

  • Вопрос задан более трёх лет назад
  • 655 просмотров

Комментировать
Решения вопроса 0
Ответы на вопрос 1

Anton3

При помощи либы fmt, вывод в двоичной системе очень прост:
fmt::print(«», num);

Если без либ, то можно написать функцию, которая выводит число в двоичной в 2 цикла. Первым циклом найти позицию самой старшей единицы, вторым циклом вывести двоичные цифры от найденной старшей вниз до нулевой.

Вывести число в двоичном виде

Author24 — интернет-сервис помощи студентам

Сложить двоичные числа и вывести ответ в двоичном и десятичном виде
Даны два неотрицательных числа в двоичной системе счисления. Необходимо сложить их и вывести ответ.

Вывести 1 байтовое целое число без знака в двоичном коде
1. вывести 1 байтовое целое число без знака в 2-ом коде а) с использованием операции деления, б) с.

Вывести число в двоичном виде
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 Есть число.

Число в двоичном виде в обратном порядке.
Дано натуральное число N. Выведите его представление в двоичном виде в обратном порядке.

Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

12260 / 7426 / 1739
Регистрация: 25.07.2009
Сообщений: 13,628
kruss802, а Вы бы по форуму поискали. Здесь таких задачек, как у дурака махорки. Один из вариантов:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include void bin_print(unsigned n) { if ( n ) { bin_print(n >> 1); printf("%u", n & 1); } } int main(void) { unsigned n; while ( printf("\nNumber: ") && scanf("%u", &n) == 1 && n ) bin_print(n); return 0; }
[andrew@easybook numbers]$ gcc -Wall bin_print.c [andrew@easybook numbers]$ ./a.out Number: 5 101 Number: 127 1111111 Number: 256 100000000 Number: 257 100000001 Number: q [andrew@easybook numbers]$

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Вывести содержимое регистров в двоичном виде
Подскажите как в debug вывести на экран содержимое регистров BX и DI в двоичном виде

Вывести коды символов в двоичном виде
нужно строку текста разбить на символы, получить их коды и вывести в ричтекстбокс, делаю я это так.

Как представить число в тексте программы в двоичном виде?
Всем здравствуйте. HEX число представляется в тексте программы так: 0x07. Записать же это число.

Вывести в двоичном виде нули и единицы 01010110001
Не понимаю почему не выводится буфер в двоичном виде, да и флаг tellg() равен -1 в конце.

Или воспользуйтесь поиском по форуму:

Как записать число в файл в двоичном режиме?

int value = 11; // . . . 00001011
В строковом режиме можно просто использовать fprintf(fp, «%d», value) и тогда в файл запишется символьное представление числа 11.
А как записать в файл двоичное представление числа, т.е само число а не строку.
Знаю только про методы fread/fwrite , но с помощью них можно записать только массив данных.
А как записать в файл одиночное число?

  • Вопрос задан более трёх лет назад
  • 1616 просмотров

1 комментарий

Простой 1 комментарий

Массив из одного числа. В качестве массива попробуй указатель на число.
Решения вопроса 1
GrigorySvetov @GrigorySvetov

1. Если про бинарный вывод (т.е. когда сам символ смысловой нагрузки не несет, а несет номер символа в кодировке) («настоящий» бинарный вывод).

Основной прикол в том, что массив в Си можно понимать как просто указатель на фиксированный по размеру набор значений, а саму переменную массива — как указатель на этот набор.
И действительно, так привычное нам обращение по индексу arr[i] в Си переводится в *(arr+i) (разыменование по указателю со смещением).
Поэтому когда мы пишем fwrite(arr, . ), на самом деле мы пишем туда УКАЗАТЕЛЬ. В остальном Си достаточно всё равно, что происходит (главное чтобы без выходов на чужую память, иначе тут уже система убьет процесс). Т.е. мы передаем указатель на ЧИСЛО (одно число) как будто это целый массив, дальше всё честно для него пишем. Код получается вот такой:

#include int main() < FILE *fp; //переменная файлового потока int value=11; //наша переменная с числом fp=fopen("output.txt","wb");//открываем файл на перезапись ('w') в бинарном режиме ('b' в "wb") if (fp==NULL)< //если файл не был открыт, то. perror("file hadn't opened");//вывести в поток ошибок сообщение (обычно это то же, что поток вывода (т.е. экран компьюетра) >else < //иначе.. fwrite(&value,sizeof(int),1,fp); //вывести значение как массив с единственной ячейкой >fclose(fp);//закрыть в любом случае (если fp==NULL, ошибкой всё равно не будет, а читается удобнее, чем все эти ветки if'ов return 0; >

2. Если про то, что в комментарии, т.е. с ноликами и единичками в файле. Это «ненастоящий» бинарный режим, т.к. каждый символ ‘0’ и ‘1’ — это правда честные отдельные символы, которые надо читать как текст. В этом случае, я думаю, Вы просто это число побитно обрабатываете и fputc()’ом загоняете (но fopen() будет уже таким: fopen(«», «w»); (а не fopen(»

Битовые операции в языке Си. Восьмеричные и шестнадцатеричные числа

Данный урок курса можно считать факультативным, т. е. необязательным. Для освоения темы этого урока вам потребуется знание о двоичной системе счисления, навыки перевода чисел из одной системы счисления в другую, а также вы должны иметь представление о том, что такое битовые (они же поразрядные) операции. С последним можно познакомиться по вот этой лекции.

В языке программирования C существуют следующие поразрядные операции: & (И), | (ИЛИ), ^ (исключающее ИЛИ), > (сдвиг вправо), ~ (поразрядное дополнение до единицы). Рассмотрим на примерах, как они работают, но перед этим уделим внимание выводу чисел в отличных от десятичной системах счисления.

В C можно присваивать целочисленные значения в десятичной, восьмеричной и шестнадцатеричной системах счисления. Для того, чтобы присвоить переменной число в восьмеричной системе счисления, перед ним надо написать 0 (ноль), в шестнадцатеричной — 0x (ноль и икс), например:

int a, b; a = 077; // восьмеричное число b = 0x1F; // шестнадцатеричное число

Любые целые числа можно выводить на экран в десятичном, восьмеричном и шестнадцатеричном представлении. Пример кода для вывода определенных ранее двух переменных в различных системаъ счисления:

printf("%d %o %x %X\n", a, a, a, a); printf("%d %o %x %X\n", b, b, b, b);

В результате на экране вы увидите:

63 77 3f 3F 31 37 1f 1F

Восьмеричные и шестнадцатеричные числа используются из-за удобства при работе с двоичной системой счисления. Каждая цифра восьмеричного числа может быть заменена тремя цифрами двоичного. И каждая цифра шестнадцатеричного числа легко заменяет четыре разряда двоичного числа. Вот таблица соответствия цифр восьмеричной системы счисления числам двоичной системы:

0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

Теперь допустим, что у нас есть восьмеричное число 037. По таблице легко понять, что в двоичном выражении оно будет выглядеть как 011 111.

Шестнадцатеричное число 7D в двоичной системе счисления будет выглядеть как 0111 1101.

Если бы мы при работе с поразрядными операциями использовали десятичные числа, то чтобы оценить результат нам бы каждый раз приходилось переводить десятичное число в двоичную систему счисления, что относительно трудоемко. Если же человек видит, например, восьмеричное число, то он может представить как оно выглядит в двоичном представлении, помня или держа перед глазами таблицу соответствия чисел. Например, как только мы видим 017, то можем представить в уме, как последние четыре бита ячейки памяти забиты единицами.

Теперь вернемся к поразрядным операциям и посмотрим как работает каждая из них. Для этого напишем небольшую программу:

int a, b; a = 017; b = 036; printf("0%o & 0%o = 0%o\n", a, b, a & b); printf("0%o | 0%o = 0%o\n", a, b, a | b); printf("0%o ^ 0%o = 0%o\n", a, b, a ^ b); printf("0%o \n", a, a  2); printf("0%o >> 2 = 0%o\n", a, a >> 2); printf("~0%o = 0%o\n", a, ~a);

Результат ее работы будет выглядеть так:

017 & 036 = 016 017 | 036 = 037 017 ^ 036 = 021 017 > 2 = 03 ~017 = 037777777760

Этот результат будет проще понять с помощью рисунка:

Результат побитовых операций

В последнем случае получилось такое большое число потому, что под форматы вывода целых чисел ( %d , %o , %X ) выделяется по 4 байта.

Теперь рассмотрим пример использования битовых операций. Допустим, у нас есть массив, требуется снять с него «маску», которая бы отражала, в какой позиции стоят отрицательные, а в какой положительные элементы. Пусть единица в бите обозначает соответствующий ей положительный элемент массива, а ноль — отрицательный. Так «битовая маска» массива будет выглядеть как 101110, или в восьмеричном представлении как 056. Составим алгоритм решения этой задачи:

  1. Будем считать, что массив состоит не более чем из 32 элементов. Поэтому для хранения его «маски» достаточно переменной типа int . Назовем ее mask и присвоим значение 0.
  2. Переберем элементы массива в цикле for . Если встречается положительный элемент, то установим соответствующий ему бит значения mask в 1.
  3. Выведем значение переменной mask на экран в виде восьмеричного числа.

Вроде бы все просто, но как установить в единицу определенный бит числа? Существует закономерность соответствия степеней двойки и двоичного представления числа:
2 0 = 0000 0001
2 1 = 0000 0010
2 2 = 0000 0100
2 3 = 0000 1000
2 4 = 0001 0000
и т.д. Теперь если применить к mask побитовую операцию | (ИЛИ), а в качестве второго операнда использовать определенную степень двойки, то один бит будет установлен в 1. Например:
(0) 0000 0000 | (2 5 ) 0010 0000 = 0010 0000
(32) 0010 0000 | (2 7 ) 1000 0000 = 1010 0000

При переборе первый элемент массива имеет индекс 0, но соответствующий ему бит в maskдолжен стоять впереди остальных. Если известно общее количество элементов массива (N), то можно определить степень двойки по формуле N — i — 1 . Так, имея четвертый положительный элемент массива (его индекс 3) из 10 элементов, следует установить в единицу седьмой с конца бит (он же будет четвертым с начала), а это значит надо использовать вторым операндом битового ИЛИ 2 6 , а 6 как раз будет 10( N ) — 3( i ) — 1.

Другая проблема — как в языке C возвести число в степень. Понятно, что можно написать свой код, но скорее всего в стандартной библиотеке уже есть подобная функция. С помощью заголовочного файла math.h можно подключить библиотеку с математическими функциями. Среди них есть функция pow() , которая принимает два числа и возвращает результат возведения первого числа в степень, выраженную вторым числом. Однако результат возвращается в виде вещественного числа, а нам требуется целое. Как быть? В Си есть операции приведения типов, которые меняют тип значения с одного на другой. Например, чтобы преобразовать значение вещественной переменной a в целое, следует написать (int) a .

Вот как может выглядеть вышеописанная программа:

#include #include #define N 12 int main() { int nums[N] = {7, 3, 9, -5, -3, 2, 1, 0, 16, -4, 2, 0}; int mask = 0; for (int i = 0; i  N; i++) if (nums[i] >= 0) mask = mask | (int) pow(2, N-i-1); printf("%o\n", mask); }

Если у вас не получается скомпилировать программу, добавьте в конце вызова gcc опцию -lm (например, gcc -o bits bits.c -lm ).

Курс с решением задач:
pdf-версия

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *