二维数组中8位二进制的组合

时间:2012-10-21 11:45:37

标签: c arrays binary bits

我想知道如何在C编程中将8位二进制数的所有组合放入二维数组中。 256x8大小的数组和0和1的所有组合应填入数组。

从00000000到11111111

2 个答案:

答案 0 :(得分:1)

因为您想要枚举所有可能性,所以您只需使用索引的二进制值即可。这是一个展开循环的版本:

for (i = 0; i < 256; ++i) {
    t[i][0] = (i >> 7) & 1;
    t[i][1] = (i >> 6) & 1;
    t[i][2] = (i >> 5) & 1;
    t[i][3] = (i >> 4) & 1;
    t[i][4] = (i >> 3) & 1;
    t[i][5] = (i >> 2) & 1;
    t[i][6] = (i >> 1) & 1;
    t[i][7] = (i >> 0) & 1;
}

其中t是您的结果数组,i是循环索引。

声明t[i][5] = (i >> 2) & 1;(例如)如下:

  • i >> 2i的3 e 位置于1 e 位置;
  • (i >> 2) & 1告诉我们i的3 e 位是0还是1

示例<子> 1

  • 输入:00001111;
  • i >> 200000011;
  • (i >> 2) & 100000001

示例<子> 2

  • 输入:00001011;
  • i >> 200000010;
  • (i >> 2) & 100000000

注意我们也可以使用宏来提高可读性:

/* Get the value of the bit at position `n` of `x`. */
#define GET_BIT(x, n) (((x) >> (n)) & 1)

for (i = 0; i < 256; ++i) {
    t[i][0] = GET_BIT(i, 7);
    t[i][1] = GET_BIT(i, 6);
    t[i][2] = GET_BIT(i, 5);
    t[i][3] = GET_BIT(i, 4);
    t[i][4] = GET_BIT(i, 3);
    t[i][5] = GET_BIT(i, 2);
    t[i][6] = GET_BIT(i, 1);
    t[i][7] = GET_BIT(i, 0);
}

示例:

#include <stdio.h>

/* Get the value of the bit at position `n` of `x`. */
#define GET_BIT(x, n) (((x) >> (n)) & 1)

int main(void)
{
    int t[256][8], i, j;

    for (i = 0; i < 256; ++i) {
        t[i][0] = GET_BIT(i, 7);
        t[i][1] = GET_BIT(i, 6);
        t[i][2] = GET_BIT(i, 5);
        t[i][3] = GET_BIT(i, 4);
        t[i][4] = GET_BIT(i, 3);
        t[i][5] = GET_BIT(i, 2);
        t[i][6] = GET_BIT(i, 1);
        t[i][7] = GET_BIT(i, 0);
    }

    for (i = 0; i < 256; ++i, puts(""))
        for (j = 0; j < 8; ++j)
            printf("%d", t[i][j]);

    return 0;
}

答案 1 :(得分:0)

这是为了让你入门:

for(int i=0;i<256;++i) {
    a[0]=i&(1<<0);
    a[1]=i&(1<<1);
    a[2]=i&(1<<2);
    ...
    a[7]=i&(1<<7);
}

这将导致所有组合的原因是,当i=0...255时它将通过所有组合00000000 ... 11111111只是以位而不是字节:所以你所要做的就是提取位到字节。