假设我们在C++中有一个void Fill(char*in,int*out)
形式的函数,它应该从char*in
中读取5个字符的二进制序列,将它们转换为int=i,并将int*out
的第i个位置从0
切换为1
。
示例:char*in
为:
'00101 10010'
,因此值为5和18。
int*out
主要为空,有32个空位,因此它是:0000000000000000000000000000000000
。
由于我们读取的数字是5和18,所以我们必须在int*out
中将(从0开始计数)第5个0
转换为1
和第18个0
转换为1
。
最终的int*out
看起来如下:0000 0000 0000 0100 0000 0000 0000 0010 0000
。换句话说,我们的int*out
是一个特定类型的集合,如果char*In
中有一个数字,则“点亮”1s
。
我想对此进行编码,我已经发现最好的方法是使用位操作。我知道我必须使用递归遍历char*in
本身,但我在找到一种方法将这些char*in
值(点亮1s
)插入到我们的int*out
中时遇到了麻烦。
我用于递归迭代char*in
的代码如下:
if(*(in) != '\0' ){
if(*(in) != ' '){
cout << *in;
Emplace(in + 1, out);
}
else{
Emplace(in + 1, out);
}
}
因为我们只需要二进制字符,所以它会贯穿整个过程直到结束,并通过每一个空格。
我的问题是-我现在如何做1
照明?我如何从这个字符中读取一个值,并在正确的位置“打开”int*out
中的1
?
谢谢你,很抱歉这么长的帖子。
我想出了一个主意!
void Fill(char *in, int *out, int i){
if(*(in+i) != '\0'){
if(*(in + i) != ' '){
int temp_int = 1;
if(*(in + i) == '1')
temp_int <<= 16;
i++;
if(*(in + i) == '1')
temp_int <<= 8;
i++;
if(*(in + i) == '1')
temp_int <<= 4;
i++;
if(*(in + i) == '1')
temp_int <<= 2;
i++;
if(*(in + i) == '1')
temp_int <<= 1;
Union(temp_int, *out, out);
}
i++;
Fill(in, out, i);
}
}
基本上,我们创建一个临时整数,根据char值将它的“1”左移,然后与原始的*out
合并。