我试图在c中打印出二进制数,但是我所遇到的困境是它以相反的顺序打印出来。我已经定义了一个函数来告诉我有多少位,这样我可以从最后一位工作
得到我可以使用的第n位
(value >> totalNumberOfBits) & 1;
在while循环中我可以运行它直到totalNumberOfBits == 0;
就是这样
while(totalNumberOfBits!= 0){
putchar(n >> totalNumberOfBits)&1;
totalNumberOfBits--;
}
任何指针都会受到欢迎 - 我想我可能会被淘汰出局,我有一种方法可以向后打印数字,但我试图找到避免这种情况的方法
谢谢
答案 0 :(得分:1)
您的putchar(n >> totalNumberOfBits)&1
是一个错误(通知正确的paren是)。
您当前的代码输出看似随机的值(基于数字中的“当前”和更重要的位),如果您只是将正确的父级移动到您想要放置的位置,那么您将编写{{ 1}}和'\0'
(它们是null和另一个控制代码)。相反,您想要写'\1'
和'0'
(数字0和1)。
这是一个最好的例子之一:
'1'
注意减量的位置(可以根据需要移动,但不能移动到for循环的第3部分 - 这将改变计算顺序),并且当num为零时,此循环不处理这种情况。 / p>
答案 1 :(得分:1)
这样做,通过使用itoa
函数转换数字并将其存储到缓冲区并使用字符串的自定义reverse
函数返回指向char的指针并将指针转换为char使用int
功能再次atoi
。这是一种简单的方法。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define STRMAX 50 char *reverse(const char *); int main(int argc, char **argv){ static char inpBuf[25]; char *ptr = NULL; int num = 1234; /* Convert num to a string */ itoa(num, inpBuf, 10); /* Reverse the string */ ptr = reverse(inpBuf); /* Convert the reversed string back to num */ num = atoi(ptr); /* num is reversed! i.e. 4321 */ /* Free the pointer */ if (ptr) free(ptr); } char *reverse(const char* sInput) { char* sOutput; int iCnt = 0, iCntRev; sOutput = (char *)malloc((STRMAX * sizeof(char)) + 1); if (sOutput){ for (iCntRev = strlen(sInput); iCntRev >= 0; iCntRev--) { *sOutput++ = sInput[iCntRev]; iCnt++; } *sOutput++ = '\0'; } return (sOutput - iCnt); }
希望这有帮助, 最好的祝福, 汤姆。
答案 2 :(得分:0)
而不是右移,尝试向左移动并以WORD大小结束。或者使用WORD大小减去位数,然后首先删除那些前导0。
另外,请不要忘记更改&
以匹配最高位。
答案 3 :(得分:0)
static void
print_binary(int value, int numBits)
{
/* postfix decrement, so the loop will run numBits times */
while (0 < numBits--) {
/*
* Since numBits was decremented it now is an index to the next bit from
* the left. So, we shift a one to the left that number of bits, do a
* bitwise-AND with the value and test whether it is not equal to 0. If
* so, print a 1. Otherwise, print a 0!
*/
putchar((value & (1 << numBits)) ? '1' : '0');
}
}
答案 4 :(得分:0)
void printbin(int input) { int i; int mask = 0x80000000; //假设32位整数 对于(I = 0; I&LT; 32;我++) { if(掩码和输入) 的putchar( '1') 其他 的putchar( '0'); mask&gt;&gt; = 1; } }
答案 5 :(得分:0)
while (totalNumberOfBits != 0) {
putchar(n >> totalNumberOfBits) & 1;
totalNumberOfBits--;
}
好的,你的代码非常接近(实际上已经按正确的顺序打印出来了),但是有3个小错误。首先,编译Visual Studio时会给出以下警告:
warning C4552: '&' : operator has no effect; expected operator with side-effect
它抱怨代码的& 1
部分,您似乎意外地将其置于putchar
函数调用的括号之外。
while (totalNumberOfBits != 0) {
putchar((n >> totalNumberOfBits) & 1);
totalNumberOfBits--;
}
第二个错误是,虽然它现在正确打印位,但您正在打印\ 0和\ 1个字符。 \ 0将不会在控制台中显示,\ 1很可能看起来像一个笑脸,所以让我们解决这个问题。
while (totalNumberOfBits != 0) {
putchar(((n >> totalNumberOfBits) & 1) ? '1' : '0');
totalNumberOfBits--;
}
现在非常接近,只剩下一个小错误。由于检查你的while循环执行,以及你递减totalNumberOfBits
的地方,你永远不会检查2 ^ 0的位,而你检查2 ^ 8,即使你的n
只有8位(因而超出范围)。所以我们移动减量,并替换!=
:
while (--totalNumberOfBits >= 0) {
putchar(((n >> totalNumberOfBits) & 1) ? '1' : '0');
}