gpt4 book ai didi

c++ - C/C++ 位数组或位 vector

转载 作者:可可西里 更新时间:2023-11-01 18:02:28 24 4
gpt4 key购买 nike

我正在学习 C/C++ 编程并且遇到过“位数组”或“位 vector ”的用法。无法理解他们的目的?这是我的疑问 -

  1. 它们是否用作 bool 标志?
  2. 能否改用int 数组? (当然有更多的内存,但是..)
  3. Bit-Masking 的概念是什么?
  4. 如果位掩码是简单的位操作以获得适当的标志,如何为它们编写一个程序?是否不难在头脑中执行此操作以查看与十进制数相对应的标志是什么?

我正在寻找应用程序,以便我更好地理解。对于例如 -

Q. 给定一个文件,其中包含范围(1 到 1 百万)内的整数。有一些重复项,因此缺少一些数字。找到寻找失踪的最快方法数字?

对于上述问题,我已经阅读了告诉我使用位数组的解决方案。如何在位中存储每个整数?

最佳答案

我认为您已经混淆了数组和数字,特别是操作二进制数的含义。

我将举例说明。假设您有许多错误消息,并且希望在函数的返回值中返回它们。现在,您可能会将错误标记为 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

我相信您知道 an 和 是如何工作的,或者可以从上面推导出它 - 按数字计算,如果任何两个数字都是 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 */
}
}

现在,实用性。当内存稀疏并且协议(protocol)没有冗长的 xml 等奢侈品时,通常将字段分隔为这么多位宽。在该字段中,您将各种位(标志、2 的幂)分配给特定含义,并应用二进制运算来推断它们是否已设置,然后对这些位进行运算。

我还应该补充一点,二元运算在概念上与计算机的底层电子学很接近。想象一下,如果位字段对应于各种电路的输出(是否承载电流)。通过使用足够多的上述电路组合,您可以制造……一台计算机。

关于c++ - C/C++ 位数组或位 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4604130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com