如何将数字转换为二进制位,然后截断或放大它们的大小,然后插入位容器



正如问题的标题所说,我想取一个数字(最好声明为intcharstd::uint8_t),将其转换为二进制表示,然后用给定的某个可变位数截断或填充它,然后将它插入一个位容器(最好是std::vector<bool>,因为我需要根据可变位数调整可变的位容器大小)。例如,我有int a= 2, b = 3。假设我必须把它分别写为三位和六位到容器中。所以我必须将010000011放入位容器中。那么,如何使用普通STL方法从2010或从3000011呢?我想尽一切办法,但一无所获。请帮忙。非常感谢。

您可以使用'shift'(>>)和'bit-wise and'(&)的组合。

首先让我们看一下按位的&:例如,如果您有一个int a=7,并用13对其进行&运算,则会得到5。为什么?因为&在位置i给出1,如果两个操作数在位置i都有1,那么我们得到:

00...000111  // binary 7
& 00...001101  // binary 13
-------------
00...000101  // binary 5

接下来,通过使用移位操作>>,您可以移位ints的二进制表示。例如,5 >> 1是2。为什么?因为每个位置都会向右偏移1。最右边的一位"掉了出来"。因此我们有:

00...00101 //binary for 5
shift by 1 to the right gives:
00...00010 // binary for 2

另一个例子:13(01101)除以2就是3(00011)。我希望你明白。

因此,通过重复移位并用1(00..0001)执行&,可以读出数字的二进制表示。

最后,您可以使用此1在vector<bool>中设置相应的位置。假设你想在帖子中显示你的表示,你必须从后面填写你的矢量。因此,例如,你可以做一些类似的事情:

unsigned int f=13; //the number we want to convert
std::vector<bool> binRepr(size, false); //size is the container-size you want to use.
for(int currBit=0; currBit<size; currBit++){
binRepr[size-1-currBit] = (f >> currBit) & 1;
}

如果容器小于int的二进制表示形式,则容器将包含截断的数字。如果它更大,它将填充0。

我使用的是unsigned int,因为对于int,你仍然需要处理负数(对于正数,它应该是一样的),我们必须深入研究两者的补码表示,这并不困难,但需要更多的技巧。

最新更新