正如问题的标题所示,我想取一个数字(最好声明为int
或char
或std::uint8_t
),将其转换为二进制表示,然后截断或用给定的可变位数填充它,然后将其插入一个位容器(最好是std::vector<bool>
,因为我需要根据可变位数的可变位容器大小)。例如,我有int a= 2, b = 3
。让我们说我必须将它分别写入容器中的三位和六位。所以我必须将010
和000011
放入位容器中。那么,我如何使用普通的STL方法从2
转到010
或3
到000011
?我尝试了所有可能的事情,但我一无所获。请帮忙。谢谢。
答案 0 :(得分:1)
您可以结合使用&#39; shift&#39; (>>
)和&#39; bit-wise和&#39; (&
)。
首先让我们看看按位&
:例如,如果你有一个int a=7
而你用&
对它进行操作13,你会得到5.为什么?
因为&amp;如果两个操作数在位置i处具有1,则在位置i处给出1。所以我们得到:
00...000111 // binary 7
& 00...001101 // binary 13
-------------
00...000101 // binary 5
接下来,通过使用移位操作>>
,您可以移动int
的二进制表示。例如5 >> 1
是2.为什么?
因为每个位置都向右移位1。最右边的位&#34;掉线&#34;。因此我们有:
00...00101 //binary for 5
shift by 1 to the right gives:
00...00010 // binary for 2
另一个例子:移位2的13(01101)是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
,您仍然需要处理负数(对于正数,它应该相同),我们将不得不深入研究这两个补码的表示并不困难,但需要更多一些小小的功能。