提问者:小点点

使用位操作填充int集


假设我们在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

谢谢你,很抱歉这么长的帖子。


共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合并。