十进制到二进制

我有一个数字,我想在C中转换为二进制(从十进制)。

我希望我的二进制文件总是以5位(小数字永远不会超过31)。 我已经有一个通过分割手动完成的function,但很难将其填充到5位。

有没有更简单的方法? 也许使用按位移位?

我也希望二进制文件在char *表示

这是一个优雅的解决方案:

 void getBin(int num, char *str) { *(str+5) = '\0'; int mask = 0x10 << 1; while(mask >>= 1) *str++ = !!(mask & num) + '0'; } 

在这里,我们首先确保字符串以空字符结尾。 然后,我们创建一个带有单个掩码的掩码(它是您期望的掩码,向左移动一次以解释while条件的第一次运行中的移位)。 每次循环时,掩码向右移动一个位置,然后相应的字符设置为’1’或’0’( !!确保我们添加0或1 '0' )。 最后,当掩码中的1移出数字时,while循环结束。

要测试它,请使用以下内容:

 int main() { char str[6]; getBin(10, str); printf("%s\n", str); return 0; } 

如果你不需要前导零,你可以使用itoa(value,outputstring,base)

例如

 char s[9]; itoa(10, s, 2); printf("%s\n", s); 

将打印出来

 1010 

另外,你可以写一个非常简单的function。

 void tobin5str(int value, char* output) { int i; output[5] = '\0'; for (i = 4; i >= 0; --i, value >>= 1) { output[i] = (value & 1) + '0'; } } int main() { char s[6]; tobin5str(10, s); printf("%s\n", s); return 0; } 

将打印出来

 01010 

更通用的方法可以是一个函数,询问您要转换多少位。

 void tobinstr(int value, int bitsCount, char* output) { int i; output[bitsCount] = '\0'; for (i = bitsCount - 1; i >= 0; --i, value >>= 1) { output[i] = (value & 1) + '0'; } } 

当然bitsCount必须是1到32之间的值,并且缓冲区字符串必须至少分配bitsCount + 1个字符。

一种方法是:

 unsigned int x = 30; char bits[] = "00000"; bits[4] = (x & 1) + '0'; x >>= 1; bits[3] = (x & 1) + '0'; x >>= 1; bits[2] = (x & 1) + '0'; x >>= 1; bits[1] = (x & 1) + '0'; x >>= 1; bits[0] = x + '0'; 

可能不是最优雅的方法……

对于31个值,您可能只想使用查找表,而不是使用malloc来分配字符串,然后使用位操作来填充它。

 static const char *bitstrings[] = { "00000", "00001", "00010", … "11111" }; 

然后你的转换就像return bitstrings[i]一样简单。 如果你经常这样做,这会更快(通过避免malloc)。

否则,你真的不需要任何移动(除了使你的常量更容易编写); 你可以使用bit-and:

 char *bits = malloc(6); bits[0] = (i & (1<<4)) ? '1' : '0'; /* you can also just write out the bit values, but the */ bits[1] = (i & (1<<3)) ? '1' : '0'; /* compiler should be able to optimize a constant! */ ⋮ bits[6] = 0; /* null-terminate string*/ 

如果你假设使用ASCII,你可以做一个(可能)微优化。 你也可以在这里使用循环,但我需要两行评论:-P。 在性能方面,两者都不重要。 所有的时间都花在了malloc上。

你总是可以将它分频并填充到5位(这样做可以填充8位,因为打印像A这样的字符就是数字65)

 #include  #include  void main(){ int binary[8], number, i; //for 5 bits use binary[5] do{ printf("input a number: "); scanf("%d",&number); fflush(stdin); }while(number>256 || number <0); //for 5 bits... 31 use number>31 || number <0 for (i=0; i<=7; i++) // for 5 bits use i<=4 { binary[i]=number%2; number = number/2; } for (i=7; i >=0; i--) //for 5 bits use i=4 printf("%d", binary[i]); number=0; // its allready 0. for (i=0; i<=7; i++) //for 5 bits use i<=4 { number=number+binary[i]*pow(2,i); } printf("\n%c",number); } 

由于您只使用5位,为什么不使用查找表? 类似于以下内容:

 /* Convert nstr to a number (decimal) and put a string representation of the * lowest 5 bits in dest (which must be at least 6 chars long) */ void getBinStr(char *dest, const char *nstr) { char *lkup[32] = { "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" }; strcpy(dest, lkup[atoi(nstr) & 0x1f]); } 

或者一个开关:

 void getBinStr(char *dest, const char *nstr) { switch (atoi(nstr)) { case 31: strcpy(dest,"11111"); break; case 30: strcpy(dest,"11110"); break; ... case 1: strcpy(dest,"00001"); break; case 0: strcpy(dest,"00000"); break; default: strcpy(dest,"error"); } } 

或者如果这看起来太长,可能会出现以下情况:

 void getBinStr(char *dest, const char *nstr) { unsigned x = atoi(nstr); dest[0] = (x & 0x10) ? '1' : '0'; dest[1] = (x & 0x08) ? '1' : '0'; dest[2] = (x & 0x04) ? '1' : '0'; dest[3] = (x & 0x02) ? '1' : '0'; dest[4] = (x & 0x01) ? '1' : '0'; dest[5] = '\0'; } 

我通常会赞成前两个中的一个,但如果由于某些原因其他的太大(例如小型微控制器的代码),最后一个可能会更好。

这些都假设您希望结果左边用零填充为5位。

 #include  #include  char numstr[9024]; int i = 0; void format(int n, int base); void printreverse(char *s); int main() { int testnum = 312; // some random test number format(testnum, 2); // 2 for binary printreverse(numstr); putchar('\n'); return 0; } void format(int n, int base) { if (n > 0) { char tmp = (n % base) + '0'; numstr[i++] = tmp; // If we put this above other two we don't need printreverse, // But then we will have unwanted results in other places of numstr if we can't reset it format(n/base, base); } else numstr[i] = '\0'; // terminating character } void printreverse(char *s) { long len = strlen(s); while (len-->0) putchar(s[len]); } 

下面是使用按位运算符将十进制转换为二进制的C程序,其中包含系统支持的任何小数,并且只保留所需的内存

 #include  #include  #include  int main (int argc, char **argv) { int n, t = 0; char *bin, b[2] = ""; scanf("%d", &n); bin = (char*)malloc(sizeof(char) + 2); while (n != 0) { t = n >> 1; t = t << 1; t = n - t; n = n >> 1; itoa(t, b, 10); bin = realloc((char*)bin, sizeof(char) + 1); strcat(bin, b); } strrev(bin); printf("\n%s\n", bin); return 0 ; } 
 #include int mask = 1; void decToBi(int); void decToBi(int n){ for(int j=15;j>=0;j--){ int result; result = n & (mask< 

希望这可以帮助

我的看法:

 char* to_bitstring(uint32_t val, char buffer[], int size) { buffer[--size] = 0; while (size > 0) { buffer[--size] = (val % 2 ? '1' : '0'); val = val >> 1; } return buffer; /* convenience */ } 

这会将SIZE字符写入BUFFER:

 char buffer[17]; printf("%s\n", to_bitstring(42, buffer, sizeof(buffer))); 

并将打印:

 0000000000101010 
 int main() { int n,c,k; printf("Enter_an_integer_in_decimal_number_system:_"); scanf("%d",&n); printf("%d_in_binary_number_system_is:_", n); for (c = n; c > 0; c = c/2) { k = c%2; k = (k>0)? printf("1"):printf("0"); } getch(); return 0; } 
 #include "stdio.h" #include "conio.h" int main(void) { int i, d , n = 1; int store[10]; printf("Please enter a number to be converted to binary:\n"); scanf("%d",&d); for (i=0;i<8 ;i++ ) store[i] = 0; i = 0; do{ if(d & n ){ n <<= 1; //10 store[i] = 1; i++; } else { n <<= 1; store[i] = 0; i++; } }while(n <= d); printf("\n"); for (i=7;i>=0 ;i-- ){ printf("%d",store[i]); if(i == 4) printf(" "); } printf("\n"); return 0; }