tipos - rotacion de bits en c
Muestra la representación binaria de un número en C? (8)
No hay un especificador de formato directo para esto en el lenguaje C. Aunque escribí este breve fragmento de Python para ayudarlo a comprender el proceso paso a paso para obtener el suyo propio.
#!/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
Explicado:
dec = entrada ("Ingrese un número decimal para convertir:") - solicite al usuario una entrada numérica (hay varias maneras de hacerlo en C a través de scanf, por ejemplo)
base = 2 - especifique que nuestra base es 2 (binario)
solution = "" - crea una cadena vacía en la que concatenaremos nuestra solución
mientras dec> = base: - mientras que nuestro número es más grande que la base ingresada
solución = str (dec% base) + solución - obtenga el módulo del número a la base y agréguelo al comienzo de nuestra cadena (debemos sumar los números de derecha a izquierda utilizando el método de división y resto). la función str () convierte el resultado de la operación en una cadena. No puede concatenar enteros con cadenas en python sin una conversión de tipo.
dec = dec / base - divide el número decimal por la base en preparación para tomar el siguiente módulo
si dec> 0: solución = solución str (dec) + - si queda algo, agrégalo al principio (este será 1, en todo caso)
solución de impresión : imprima el número final
Posible duplicado:
¿Hay un convertidor de impresión para imprimir en formato binario?
Todavía aprendiendo C y yo nos preguntábamos:
Dado un número, ¿es posible hacer algo como lo siguiente?
char a = 5;
printf("binary representation of a = %b",a);
> 101
¿O tendría que escribir mi propio método para hacer la transformación a binario?
Tienes que escribir tu propia transformación. Solo los números decimales, hexadecimales y octales son compatibles con los especificadores de formato.
Este código debe manejar sus necesidades hasta 64 bits.
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
Sí (escribe el tuyo), algo así como la siguiente función completa.
#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;
}
Agregue este elemento principal al final del mismo para verlo en funcionamiento:
#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;
}
Ejecútelo con "progname 0 7 12 52 123"
para obtener:
[ 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'')
#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;
}
Use una tabla de búsqueda, como:
char *table[16] = {"0000", "0001", .... "1111"};
luego imprime cada mordisco como este
printf("%s%s", table[a / 0x10], table[a % 0x10]);
Seguramente puedes usar solo una tabla, pero será marginalmente más rápida y demasiado grande.
No hay una forma directa (es decir, usar printf
u otra función de biblioteca estándar) para imprimirlo. Deberá escribir su propia función.
/* This code has an obvious bug and another non-obvious one :) */
void printbits(unsigned char v) {
for (; v; v >>= 1) putchar(''0'' + (v & 1));
}
Si está usando terminal, puede usar códigos de control para imprimir bytes en orden natural:
void printbits(unsigned char v) {
printf("%*s", (int)ceil(log2(v)) + 1, "");
for (; v; v >>= 1) printf("/x1b[2D%c",''0'' + (v & 1));
}
Basado en la respuesta de dirkgently , pero arreglando sus dos errores, y siempre imprimiendo una cantidad fija de dígitos:
void printbits(unsigned char v) {
int i; // for C89 compatability
for(i = 7; i >= 0; i--) putchar(''0'' + ((v >> i) & 1));
}