Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何以滑动窗口方式从std::bitset读取位并将其转换为int?_C++_Bit Manipulation_Bitset - Fatal编程技术网

C++ 如何以滑动窗口方式从std::bitset读取位并将其转换为int?

C++ 如何以滑动窗口方式从std::bitset读取位并将其转换为int?,c++,bit-manipulation,bitset,C++,Bit Manipulation,Bitset,我有std::bitset,其中第一个n位被设置为一些值。对于std::bitset中的每个索引,我想读取m位(mn时,我想概括一下 例如,对于n=6和m=2: std::bitset<8> my_bits {0b00101101}; // out of 8 bits, first 6 are set // bit indexes 76543210 现在我有下面的代码,它似乎可以工作(运行它)。我在找更优雅的东西 #include <iostream&g

我有
std::bitset
,其中第一个
n
位被设置为一些值。对于
std::bitset
中的每个
索引
,我想读取
m
位(
m
),并将它们转换为
int
。当
(index+m)>n
时,我想概括一下

例如,对于
n=6
m=2

std::bitset<8> my_bits {0b00101101}; // out of 8 bits, first 6 are set
// bit indexes            76543210
现在我有下面的代码,它似乎可以工作(运行它)。我在找更优雅的东西

#include <iostream>
#include <bitset>
#include <cmath>
int main() {
    const std::bitset <8> my_bits {0b00101101};
    int n = 6;
    int m = 2;

    for (int n_ind = 0; n_ind < n; ++n_ind) {

        std::cout << "ind " << n_ind << " -> ";

        int exp_2 = 0;
        int res = 0;
        for (int m_i = 0; m_i < m; ++m_i) {
            int curr_ind = (n_ind + m_i) % n; // % n is for wrap-around
            res += my_bits[curr_ind] * std::pow(2, exp_2);
            exp_2++;
        }

        std::cout << "res: " << res << std::endl;
    }

    return 0;
}
#包括
#包括
#包括
int main(){
常量std::位集my_位{0b00101101};
int n=6;
int m=2;
对于(int n_ind=0;n_indstd::cout编写一个函数。封装算法。将结果累积到您将返回的实体中。并使用位移位而不是
std::pow

#include <iostream>
#include <bitset>
#include <vector>

template<size_t N>
std::vector<int> convert_bitset_to_ints(const std::bitset<N>& bs, unsigned n, unsigned m) {
    std::vector<int> ret(n);

    for(size_t i = 0; i < n; ++i) {
        for (size_t j = 0; j < m; ++j) {
            ret[i] <<= 1;
            ret[i] |= bs[(i + j) % n];
        }
    }

    return ret;
}

int main() {
    const std::bitset <8> my_bits {0b00101101};
    auto v = convert_bitset_to_ints(my_bits, 6, 2);

    for (auto&& i : v) {
        std::cout << "res=" << i << " mask=" << std::bitset<2>(i) << "\n"; 
    }

    return 0;
}
#包括
#包括
#包括
模板
std::vector convert_bitset_to_ints(常量std::bitset&bs,无符号n,无符号m){
std::向量ret(n);
对于(尺寸i=0;iret[i]编写一个函数。封装算法。将结果累积到您将返回的实体中。并使用位移位而不是
std::pow

#include <iostream>
#include <bitset>
#include <vector>

template<size_t N>
std::vector<int> convert_bitset_to_ints(const std::bitset<N>& bs, unsigned n, unsigned m) {
    std::vector<int> ret(n);

    for(size_t i = 0; i < n; ++i) {
        for (size_t j = 0; j < m; ++j) {
            ret[i] <<= 1;
            ret[i] |= bs[(i + j) % n];
        }
    }

    return ret;
}

int main() {
    const std::bitset <8> my_bits {0b00101101};
    auto v = convert_bitset_to_ints(my_bits, 6, 2);

    for (auto&& i : v) {
        std::cout << "res=" << i << " mask=" << std::bitset<2>(i) << "\n"; 
    }

    return 0;
}
#包括
#包括
#包括
模板
std::vector convert_bitset_to_ints(常量std::bitset&bs,无符号n,无符号m){
std::向量ret(n);
对于(尺寸i=0;iret[i]我想展示一个基于
std::string
的附加解决方案

不幸的是,
std::bitset
没有那么强大,提供的功能也不多。但是,它至少有一个转换函数来生成
std::string
。请参阅

有了它,我们马上就有了所需的功能。因此,首先我们将用所需的二进制数字构造一个字符串(使用)。为了处理换行,我们将简单地将相同的字符串添加两次。然后,
0b101101
将生成“101101”

对于结果,我们只对原始的子字符串进行迭代

请参见以下示例:

#include <iostream>
#include <bitset>
#include <string>

// Programm parameters
constexpr size_t NumberOfBits = 8U;
constexpr size_t n = 6;
constexpr size_t m = 2;

int main() {

    // The test data
    const std::bitset <NumberOfBits> myBits{ 0b00101101 };

    // Convert to binary string
    const std::string s(myBits.to_string(), NumberOfBits - n, n);

    // For easier handling of wrap-arounds we concatenate the string with itself --> 101101101101
    const std::string bitString = s + s;

    // Iterate over m-wide substrings and show converted result
    for (size_t i{}; i < n; ++i)
        std::cout << i + 1 << ".\t" << bitString.substr(i, m) << " --> " << std::stoul(bitString.substr(i, m), nullptr, 2) << '\n';

    return 0;
}
#包括
#包括
#包括
//程序参数
constexpr size\u t NumberOfBits=8U;
constexpr大小n=6;
constexpr size\u t m=2;
int main(){
//测试数据
常量std::位集myBits{0b00101101};
//转换为二进制字符串
常量std::字符串s(myBits.to_string(),NumberOfBits-n,n);
//为了更容易地处理换行符,我们将字符串与自身-->101101连接起来
常量std::string bitString=s+s;
//迭代m宽的子字符串并显示转换后的结果
for(size_t i{};istd::cout我想展示一个基于
std::string
的附加解决方案

不幸的是,
std::bitset
没有那么强大,提供的功能也不多。但是,它至少有一个转换函数来生成
std::string
。请参阅

有了它,我们马上就有了所需的功能。因此,首先我们将用所需的二进制数字构造一个字符串(使用)。为了处理换行,我们将简单地将相同的字符串添加两次。然后,
0b101101
将生成“101101”

对于结果,我们只对原始的子字符串进行迭代

请参见以下示例:

#include <iostream>
#include <bitset>
#include <string>

// Programm parameters
constexpr size_t NumberOfBits = 8U;
constexpr size_t n = 6;
constexpr size_t m = 2;

int main() {

    // The test data
    const std::bitset <NumberOfBits> myBits{ 0b00101101 };

    // Convert to binary string
    const std::string s(myBits.to_string(), NumberOfBits - n, n);

    // For easier handling of wrap-arounds we concatenate the string with itself --> 101101101101
    const std::string bitString = s + s;

    // Iterate over m-wide substrings and show converted result
    for (size_t i{}; i < n; ++i)
        std::cout << i + 1 << ".\t" << bitString.substr(i, m) << " --> " << std::stoul(bitString.substr(i, m), nullptr, 2) << '\n';

    return 0;
}
#包括
#包括
#包括
//程序参数
constexpr size\u t NumberOfBits=8U;
constexpr大小n=6;
constexpr size\u t m=2;
int main(){
//测试数据
常量std::位集myBits{0b00101101};
//转换为二进制字符串
常量std::字符串s(myBits.to_string(),NumberOfBits-n,n);
//为了更容易地处理换行符,我们将字符串与自身-->101101连接起来
常量std::string bitString=s+s;
//迭代m宽的子字符串并显示转换后的结果
for(size_t i{};istd::cout一旦你观察到这样一个基本事实,即如果你在
int res
中已经有
m
位的值,那么读取下一位只需要将
res
左移1,将下一位添加到
res
,然后屏蔽最低的
m
位,a现在您有了下一个值。只需要一个
for
循环就可以完成所有这一切。很简单,不是吗?尝试从头开始为每个起始位位置重新计算
res
(如图所示代码所示),是完全错误的方法。@SamVarshavchik,我更新了我的帖子,试图实现你的建议,你能检查一下为什么它不能正常工作吗?
我正在寻找一些更优雅的方法
可以使这个问题基于观点。。现在我得到了
错误:“ind\u t”没有在这个范围内声明。
。大概它不起作用了因为你忘了声明
ind\u t
@gmatht,我删除了一行,忘了更改索引。现在它应该编译了。我的意思是结果是错误的。一旦你观察到一个基本事实,即如果你在
int res
中已经有
m
位的值,读取下一位involv,优雅的解决方案应该非常明显这只不过是将
res
左移1,将下一个位添加到
res
,然后屏蔽最低的
m
位,现在就有了下一个值。只需要一个
for
循环就可以完成所有这一切。很简单,不是吗?尝试从头开始为每个起始位位置重新计算
res
(正如所显示的代码所示),这是完全错误的方法。@SamVarshavchik,我更新了我的帖子,试图实现你的建议,你能检查一下为什么它不能正常工作吗?
我正在寻找更优雅的方法
可以让这个问题基于观点。。现在我得到
错误:?