扭转订单的麻烦

时间:2010-02-03 13:56:59

标签: c

我试图在c中打印出二进制数,但是我所遇到的困境是它以相反的顺序打印出来。我已经定义了一个函数来告诉我有多少位,这样我可以从最后一位工作

得到我可以使用的第n位

(value >> totalNumberOfBits) & 1;

在while循环中我可以运行它直到totalNumberOfBits == 0;

就是这样

while(totalNumberOfBits!= 0){
     putchar(n >> totalNumberOfBits)&1;
     totalNumberOfBits--;
}

任何指针都会受到欢迎 - 我想我可能会被淘汰出局,我有一种方法可以向后打印数字,但我试图找到避免这种情况的方法

谢谢

6 个答案:

答案 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');
}