【问题标题】:Combinations of 8 bits binary in an two dimensional array [closed]二维数组中8位二进制的组合[关闭]
【发布时间】:2012-10-11 10:35:19
【问题描述】:

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

从 00000000 到 11111111

【问题讨论】:

  • 你的意思是什么组合?你的意思是你想要一个 256x256 大小的数组,还是别的什么?请澄清问题!
  • 256x8 大小的数组,所有 0 和 1 的组合都应填充到数组中。
  • for 循环从 0 到 255,二维数组的 y 步长为 8...

标签: c arrays binary bits


【解决方案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 &gt;&gt; 2) &amp; 1; 语句(例如)的作用如下:

  • i &gt;&gt; 2i 的 3e 位放在 1e 位置;
  • (i &gt;&gt; 2) &amp; 1 让我们知道i 的第 3e 位是 0 还是 1

示例1

  • 输入:00001111
  • i &gt;&gt; 200000011
  • (i &gt;&gt; 2) &amp; 1: 00000001

示例2

  • 输入:00001011
  • i &gt;&gt; 200000010
  • (i &gt;&gt; 2) &amp; 1: 00000000

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

/* 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;
}

【讨论】:

  • 你能解释一下 [ (i >> 7) & 1 ] 的作用吗
  • 它给出了i的8e位的值:01
  • 如果我没有想错,t[i][0] = 1 和 t[i][1] = 1 吗?
  • 取决于i的值。在我的编辑中查看测试。
  • 能否解释一下如果 i=8 会发生什么。并使用这个 (i >> 2) & 1
【解决方案2】:

这是为了让你开始:

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 只是位,而不是字节:所以你所要做的就是将位提取到字节。

【讨论】:

  • 我希望它是这样的:00000001 00000010 00000011 00000100 00000101
  • 是的,会的。例如,考虑当 i=3 时发生的情况:3 的位表示为 00000011。因此您只需使用 &amp;(二进制与)和特殊移位的“提取器位”(1
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多