[英]How to print binary from an integer
#include <stdio.h>
#include <stdlib.h>
void main()
{
int testNums[] = {3, 0x12, 0xFF, -3};
int testBits[] = {9, 7, 12, 15};
int i;
for (i = 0; i < sizeof(testNums) / sizeof(testNums[0]); i++)
printBin(testNums[i], testBits[i]);
}
void printBin(int num, int bits)
{
int pow;
int mask = 1 << bits - 1;
for(pow=0; pow<bits; pow++)
{
if(mask & num)
printf("1");
else
printf("0");
num<<1;
}
printf("\n");
}
它不会打印出正确的二进制数,但是具有正确的位数,并提供有关如何解决此问题的建议?
您的问题在这里,在printBin
:
num<<1;
该语句不执行任何操作。 您想要的是:
num<<=1;
为了清楚起见,您还应该在此处使用括号:
int mask = 1 << (bits - 1);
你应该将printBin
上述main
这样定义的函数被调用的时候是可见的。
最后, main
应该始终返回int
。
您的代码中存在几个问题:
printBin()
的原型。 int main(void)
或int main(int argc, char** argv)
代替void main()
。 num<<1;
是没有副作用的表达式。 也许您可以从编译器的警告中推断出这一点。 写num<<=1;
有所作为。 printf("%d", !!(mask & num));
? 这是使用clang编译时不会发出警告的固定代码:
#include <stdio.h>
#include <stdlib.h>
void printBin(int num, int bits);
int main(void)
{
int testNums[] = {3, 0x12, 0xFF, -3};
int testBits[] = {9, 7, 12, 15};
int i;
for (i = 0; i < sizeof testNums / sizeof testNums[0]; i++)
printBin(testNums[i], testBits[i]);
return 0;
}
void printBin(int num, int bits)
{
int pow;
int mask = 1 << (bits - 1);
for(pow=0; pow<bits; pow++)
{
printf("%d", mask & num);
num <<= 1;
}
putchar('\n');
}
输出:
000000011
0010010
000011111111
111111111111101
尽管您的方法是常规方法,并且@dbush的答案是适当的,但我想提及另一种方法。 您可能知道这一点,并且它不能很好地处理负值,但是通过这种方法,您可以轻松地将任何基数转换为其他基数
#include <stdio.h>
#include <string.h>
#define RESOLUTION 128
void compute(int number, int base, char* placeHolder){
int k = 0;
int i, j;
char temp;
while(number){
placeHolder[k++] = "0123456789ABCDEF"[number % base];
number /= base;
}
if (k != 0) {
placeHolder[k] = '\0';
for(i = 0, j = strlen(placeHolder) - 1; i < j; i++, j--){
temp = placeHolder[i];
placeHolder[i] = placeHolder[j];
placeHolder[j] = temp;
}
}else{
placeHolder[0] = '0';
placeHolder[1] = '\0';
}
}
int main(void) {
char bin[RESOLUTION];
compute(0xFF, 10, bin);
printf("%s\n", bin);
return 0;
}
您可以RESOLUTION
更改RESOLUTION
值。
更特定于二进制文件,您可以打印任何数据类型的二进制文件,例如:
void printBits(size_t const size, void const * const ptr)
{
unsigned char *b = (unsigned char*) ptr;
unsigned char byte;
int i, j;
for (i=size-1;i>=0;i--)
{
for (j=7;j>=0;j--)
{
byte = b[i] & (1<<j);
byte >>= j;
printf("%u", byte);
}
}
puts("");
}
int main()
{
int i = 23;
uint ui = UINT_MAX;
float f = 23.45f;
printBits(sizeof(i), &i);
printBits(sizeof(ui), &ui);
printBits(sizeof(f), &f);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.