Sri*_*aju 7 c c++ bit bitarray bitvector
我正在学习C/C++编程并遇到过"位数组"或"位向量"的用法.我无法理解他们的目的?这是我的疑惑 -
int数组吗?(当然更多的记忆,但..)我正在寻找应用程序,以便我能更好地理解.对于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次内存
斯万
| 归档时间: |
|
| 查看次数: |
20008 次 |
| 最近记录: |