C/C++位数组或位向量

Sri*_*aju 7 c c++ bit bitarray bitvector

我正在学习C/C++编程并遇到过"位数组"或"位向量"的用法.我无法理解他们的目的?这是我的疑惑 -

  1. 它们是否用作布尔标志?
  2. 可以使用int数组吗?(当然更多的记忆,但..)
  3. 这个Bit-Masking的概念是什么?
  4. 如果位掩码是简单的位操作以获得适当的标志,那么如何为它们编程?是不是很难在脑袋里做这个操作,看看标志会是什么,与十进制数相对应?

我正在寻找应用程序,以便我能更好地理解.对于Eg -

问:您将获得一个包含范围内的整数(1到1百万)的文件.有一些重复,因此缺少一些数字.找到找到丢失数字的最快方法?

对于上面的问题,我已经阅读了告诉我使用位数组的解决方案.如何将每个整数存储一下?

小智 14

我认为你已经把数组和数字混淆了,特别是操纵二进制数字意味着什么.

我将以身作则.假设您有许多错误消息,并且希望以函数的返回值返回它们.现在,您可以标记您的错误1,2,3,4 ...这对您的想法有意义,但是如果只给出一个数字,您如何计算出发生了哪些错误?

现在,尝试标记错误1,2,4,8,16 ...基本上增加2的幂.为什么这样做?好吧,当你工作基地2时,你正在操纵一个数字,例如00000000每个数字对应2的幂乘以其右边的位置.因此,假设出现错误1,4和8.那么,那可以表示为00001101.相反,第一个数字= 1*2 ^ 0,第三个数字1*2 ^ 2和第四个数字1*2 ^ 3.将它们全部添加为13.

现在,我们可以通过应用位掩码来测试是否发生了这样的错误.例如,如果您想在8发生错误时计算出来,请使用8 =的位表示00001000.现在,为了提取是否发生了错误,请使用二进制文件,如下所示:

  00001101
& 00001000
= 00001000
Run Code Online (Sandbox Code Playgroud)

我确定你知道如何工作或者可以从上面推断 - 工作数字,如果任何两位数都是1,结果是1,否则它是0.

现在,在C:

int func(...)
{
    int retval = 0;

    if ( sometestthatmeans an error )
    {
        retval += 1;
    }


    if ( sometestthatmeans an error )
    {
        retval += 2;
    }
    return retval
}

int anotherfunc(...)
{
    uint8_t x = func(...)

    /* binary and with 8 and shift 3 plaes to the right
     * so that the resultant expression is either 1 or 0 */
    if ( ( ( x & 0x08 ) >> 3 ) == 1 )
    {
        /* that error occurred */
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,实用性.当内存稀疏且协议没有冗长的冗长的xml等时,通常将字段划分为如此多的位宽.在该字段中,您将各种位(标志,2的幂)分配给某个含义,并应用二进制运算来推断它们是否已设置,然后对它们进行操作.

我还应该补充说,二进制操作与计算机的底层电子设备关系密切.想象一下,如果位字段对应于各种电路的输出(携带电流与否).通过使用所述电路的足够组合,您可以制作一台计算机.


小智 9

关于bits数组的用法:

如果你知道"只有"100万个数字 - 你使用一个100万位的数组.在开始时,所有位都将为零,并且每次读取数字时 - 使用此数字作为索引,并将此索引中的位更改为1(如果它不是已经存在的那个).

读完所有数字后 - 缺少的数字是数组中零的索引.

例如,如果我们只有0到4之间的数字,则数组在开头看起来像这样:0 0 0 0 0.如果我们读取数字:3,2,2数组看起来像这样:读3 - > 0 0 0 1 0.读3(再次) - > 0 0 0 1 0.读2 - > 0 0 1 1 0.检查零的索引:0,1,4 - 这些是缺少的数字

BTW,当然你可以使用整数而不是位,但它可能需要(取决于系统)32次内存

斯万

  • `开头所有位都将为零'以某种方式触动我. (8认同)