正如问题的标题所说,我想取一个数字(最好声明为int
、char
或std::uint8_t
),将其转换为二进制表示,然后用给定的某个可变位数截断或填充它,然后将它插入一个位容器(最好是std::vector<bool>
,因为我需要根据可变位数调整可变的位容器大小)。例如,我有int a= 2, b = 3
。假设我必须把它分别写为三位和六位到容器中。所以我必须将010
和000011
放入位容器中。那么,如何使用普通STL方法从2
到010
或从3
到000011
呢?我想尽一切办法,但一无所获。请帮忙。非常感谢。
您可以使用'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
接下来,通过使用移位操作>>
,您可以移位int
s的二进制表示。例如,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
,你仍然需要处理负数(对于正数,它应该是一样的),我们必须深入研究两者的补码表示,这并不困难,但需要更多的技巧。