Отображать двоичное представление числа на C?[дубликат]
-
22-08-2019 - |
Вопрос
Возможный Дубликат:
Существует ли конвертер printf для печати в двоичном формате?
Все еще изучаю C, и мне было интересно:
Учитывая число, возможно ли сделать что-то вроде следующего?
char a = 5;
printf("binary representation of a = %b",a);
> 101
Или мне пришлось бы написать свой собственный метод для преобразования в двоичный?
Решение
Да (напишите свой собственный), что-то вроде следующей полной функции.
#include <stdio.h> /* only needed for the printf() in main(). */
#include <string.h>
/* Create a string of binary digits based on the input value.
Input:
val: value to convert.
buff: buffer to write to must be >= sz+1 chars.
sz: size of buffer.
Returns address of string or NULL if not enough space provided.
*/
static char *binrep (unsigned int val, char *buff, int sz) {
char *pbuff = buff;
/* Must be able to store one character at least. */
if (sz < 1) return NULL;
/* Special case for zero to ensure some output. */
if (val == 0) {
*pbuff++ = '0';
*pbuff = '\0';
return buff;
}
/* Work from the end of the buffer back. */
pbuff += sz;
*pbuff-- = '\0';
/* For each bit (going backwards) store character. */
while (val != 0) {
if (sz-- == 0) return NULL;
*pbuff-- = ((val & 1) == 1) ? '1' : '0';
/* Get next bit. */
val >>= 1;
}
return pbuff+1;
}
Добавьте это основное в конец, чтобы увидеть его в действии:
#define SZ 32
int main(int argc, char *argv[]) {
int i;
int n;
char buff[SZ+1];
/* Process all arguments, outputting their binary. */
for (i = 1; i < argc; i++) {
n = atoi (argv[i]);
printf("[%3d] %9d -> %s (from '%s')\n", i, n,
binrep(n,buff,SZ), argv[i]);
}
return 0;
}
Запустите его с помощью "progname 0 7 12 52 123"
чтобы получить:
[ 1] 0 -> 0 (from '0')
[ 2] 7 -> 111 (from '7')
[ 3] 12 -> 1100 (from '12')
[ 4] 52 -> 110100 (from '52')
[ 5] 123 -> 1111011 (from '123')
Другие советы
Прямого пути не существует (т.е.используя printf
или другая стандартная библиотечная функция), чтобы распечатать его.Вам придется написать свою собственную функцию.
/* This code has an obvious bug and another non-obvious one :) */
void printbits(unsigned char v) {
for (; v; v >>= 1) putchar('0' + (v & 1));
}
Если вы используете терминал, вы можете использовать управляющие коды для печати байтов в естественном порядке:
void printbits(unsigned char v) {
printf("%*s", (int)ceil(log2(v)) + 1, "");
for (; v; v >>= 1) printf("\x1b[2D%c",'0' + (v & 1));
}
Основанный на ответ диркджентли, но исправляет его две ошибки и всегда печатает фиксированное количество цифр:
void printbits(unsigned char v) {
int i; // for C89 compatability
for(i = 7; i >= 0; i--) putchar('0' + ((v >> i) & 1));
}
#include<iostream>
#include<conio.h>
#include<stdlib.h>
using namespace std;
void displayBinary(int n)
{
char bistr[1000];
itoa(n,bistr,2); //2 means binary u can convert n upto base 36
printf("%s",bistr);
}
int main()
{
int n;
cin>>n;
displayBinary(n);
getch();
return 0;
}
Используйте таблицу подстановки, например:
char *table[16] = {"0000", "0001", .... "1111"};
затем распечатайте каждый кусочек вот так
printf("%s%s", table[a / 0x10], table[a % 0x10]);
Конечно, вы можете использовать только одну таблицу, но это будет немного быстрее и слишком велико.
Этот код должен удовлетворять вашим потребностям с точностью до 64 бит.
char* pBinFill(long int x,char *so, char fillChar); // version with fill
char* pBin(long int x, char *so); // version without fill
#define width 64
char* pBin(long int x,char *so)
{
char s[width+1];
int i=width;
s[i--]=0x00; // terminate string
do
{ // fill in array from right to left
s[i--]=(x & 1) ? '1':'0'; // determine bit
x>>=1; // shift right 1 bit
} while( x > 0);
i++; // point to last valid character
sprintf(so,"%s",s+i); // stick it in the temp string string
return so;
}
char* pBinFill(long int x,char *so, char fillChar)
{ // fill in array from right to left
char s[width+1];
int i=width;
s[i--]=0x00; // terminate string
do
{
s[i--]=(x & 1) ? '1':'0';
x>>=1; // shift right 1 bit
} while( x > 0);
while(i>=0) s[i--]=fillChar; // fill with fillChar
sprintf(so,"%s",s);
return so;
}
void test()
{
char so[width+1]; // working buffer for pBin
long int val=1;
do
{
printf("%ld =\t\t%#lx =\t\t0b%s\n",val,val,pBinFill(val,so,0));
val*=11; // generate test data
} while (val < 100000000);
}
Output:
00000001 = 0x000001 = 0b00000000000000000000000000000001
00000011 = 0x00000b = 0b00000000000000000000000000001011
00000121 = 0x000079 = 0b00000000000000000000000001111001
00001331 = 0x000533 = 0b00000000000000000000010100110011
00014641 = 0x003931 = 0b00000000000000000011100100110001
00161051 = 0x02751b = 0b00000000000000100111010100011011
01771561 = 0x1b0829 = 0b00000000000110110000100000101001
19487171 = 0x12959c3 = 0b00000001001010010101100111000011
Вы должны написать свою собственную трансформацию.Спецификаторы формата поддерживают только десятичные, шестнадцатеричные и восьмеричные числа.
В языке C для этого нет прямого спецификатора формата.Хотя я написал этот краткий фрагмент python, чтобы помочь вам шаг за шагом разобраться в процессе создания вашего собственного.
#!/usr/bin/python
dec = input("Enter a decimal number to convert: ")
base = 2
solution = ""
while dec >= base:
solution = str(dec%base) + solution
dec = dec/base
if dec > 0:
solution = str(dec) + solution
print solution
Объясненный:
dec = input("Введите десятичное число для преобразования:") - запрашивать у пользователя числовой ввод (есть несколько способов сделать это на C, например, через scanf)
основание = 2 - укажите, что наша база равна 2 (двоичная)
решение = "" - создайте пустую строку, в которой мы будем объединять наше решение
в то время как dec >= база: - пока наш номер больше, чем введенная база
раствор = str (dec%основания) + раствор - получаем модуль числа от основания и добавляем его в начало нашей строки (мы должны складывать числа справа налево, используя метод деления и остатка).функция str() преобразует результат операции в строку.Вы не можете объединить целые числа со строками в python без преобразования типа.
дек = дек/база - предварительно разделите десятичное число на основание, чтобы получить следующее по модулю
если декабрь > 0: решение = str (dec) + решение - если что-то осталось, добавьте это в начало (это будет 1, если что)
решение для печати - выведите окончательный номер