有没有办法打印位而不使用在C循环?

问题描述 投票:9回答:4

现在,我做的是这样的:

void print_bits(unsigned int x)
{
    int i;
    for(i=WORD_SIZE-1; i>=0; i--) {
        (x & (1 << i)) ? putchar('1') : putchar('0');
    }
    printf("\n");
}

此外,这将是巨大的,有独立的字大小(目前在我的例子中设置为32)的解决方案。

c bit-manipulation
4个回答
3
投票

这个怎么样:

void print2Bits(int a) {
    char* table[] = {
        "00",
        "01",
        "10",
        "11"
    };
    puts(table[a & 3]);
}

void printByte(int a) {
    print2Bits(a >> 6);
    print2Bits(a >> 4);
    print2Bits(a >> 2);
    print2Bits(a);
}

void print32Bits(int a) {
    printByte(a >> 24);
    printByte(a >> 16);
    printByte(a >> 8);
    printByte(a);
}

我想,这就是你会得到一个写二进制数无环路闭合。


2
投票

您可以尝试itoa。虽然它不是标准的C lib中,这是大多数C编译器可用。

void print_bits(int x)
{
    char bits[33];
    itoa(x, bits, 2);
    puts(bits);
}

2
投票

而不是使多个呼叫在一个循环中,它很可能是更有效的,然后再输出建立一个临时的字符串,经由一个呼叫到例如到putcharprintf puts

void print_bits(unsigned int x)
{
    const unsigned int n = sizeof(x) * CHAR_BIT;
    unsigned int mask = 1 << (n - 1);
    char s[n + 1];

    for (unsigned int i = 0; i < n; ++i)
    {
        s[i] = (x & mask) ? '1' : '0';
        mask >>= 1;
    }
    s[n] = '\0';
    puts(s);
}

LIVE DEMO


1
投票

这是做它的字节,我发现前一段时间有点哈克的方式。我认为这是值得尽管它不是最好的解决办法在这里进行链接。 http://gynvael.coldwind.pl/n/c_cpp_number_to_binary_string_01011010

void to_bin(unsigned char c, char *out) {
    *(unsigned long long*)out = 0x3030303030303030ULL // ASCII '0'*8
        + (((c * 0x8040201008040201ULL)   // spread out eight copies of c
           >>7) & 0x101010101010101ULL);  // shift to LSB & mask
}

通过@cmaster提供的方法是最佳的,干净的。在8位的部分做可能会更好,但。你会用你的方法,以避免手工编写256串构造表在一个循环。我不认为内存将是一个问题太(这将需要大约2kB的)。

虽然我不认为有办法做到这一点任何规模的变量不循环。

© www.soinside.com 2019 - 2024. All rights reserved.