字符串到c 中的bitset

character string to bitset in C++

本文关键字:bitset 中的 字符串      更新时间:2023-10-16

我仍然是C 的新手,并且正在试图弄清楚我无法正确地将值传递给bitset的内容,至少我怀疑这就是问题所在。我写了一个小功能,以帮助翻转十六进制价值以扭转末日的位置。因此,示例将是输入0x01,它将返回0x80。

这是我写的代码。

int flipBits(char msd, char lsd) {
char ch[5];
sprintf_s(ch, "0x%d%d", msd, lsd);
char buffer[5];
strncpy_s(buffer, ch, 4);
cout << ch << endl;
cout << buffer << endl;
bitset<8> x(buffer);
bitset<8> y;
for (int i = 0; i < 8; i++) {
    y[i] = x[7 - i];
}
cout << y << endl;              // print the reversed bit order
int b = y.to_ulong();           // convert the binary to int
cout << b << endl;              // print the int
cout << hex << b << endl;       // print the hex

return b;
}

我尝试添加strncpy,因为我认为Sprintf的无效终结器可能与BITSet无法正常工作。如果在线

bitset<8> x(buffer);

我用十六进制值替换缓冲区,例如0x01,然后按照我的期望,它可以正常运行并打印出0x80,但是如果我尝试使用缓冲区使用该值,则它不起作用。

我们可以编写一个类似STL的容器包装器,以便我们写:

int main() {
    std::bitset<8> x(0x01);
    auto container = make_bit_range(x);
    std::reverse(container.begin(), container.end());
    std::cout << x << std::endl;
}

并期望输出:

10000000

完整代码:

#include <iostream>
#include <bitset>
#include <algorithm>
template<std::size_t N>
struct bit_reference  {
    bit_reference(std::bitset<N>& data, int i) : data_(data), i_(i) {}
    operator bool() const { return data_[i_]; }
    bit_reference& operator=(bool x) {
        data_[i_] = x;
        return *this;
    }
    std::bitset<N>& data_;
    int i_;
};
template<std::size_t N>
void swap(bit_reference<N> l, bit_reference<N> r) {
    auto lv = bool(l);
    auto rv = bool(r);
    std::swap(lv, rv);
    l = lv;
    r = rv;
}

template<std::size_t N>
struct bit_range {
    using bitset_type = std::bitset<N>;
    bit_range(bitset_type &data) : data_(data) {}
    struct iterator {
        using iterator_category = std::bidirectional_iterator_tag;
        using value_type = bit_reference<N>;
        using difference_type = int;
        using pointer = value_type *;
        using reference = value_type &;
        iterator(bitset_type &data, int i) : data_(data), i_(i) {}
        bool operator==(iterator const &r) const { return i_ == r.i_; }
        bool operator!=(iterator const &r) const { return i_ != r.i_; }
        iterator &operator--() {
            return update(i_ - 1);
        }
        iterator &operator++() {
            return update(i_ + 1);
        }
        value_type operator*() const {
            return bit_reference<N>(data_, i_);
        }
    private:
        auto update(int pos) -> iterator & {
            i_ = pos;
            return *this;
        }
    private:
        bitset_type &data_;
        int i_;
    };
    auto begin() const { return iterator(data_, 0); }
    auto end() const { return iterator(data_, int(data_.size())); }
private:
    bitset_type &data_;
};
template<std::size_t N>
auto make_bit_range(std::bitset<N> &data) {
    return bit_range<N>(data);
}

int main() {
    std::bitset<8> x(0x01);
    auto container = make_bit_range(x);
    std::reverse(container.begin(), container.end());
    std::cout << x << std::endl;
}

在这里也有很多有趣的算法:c

中的BIT逆转算法(从MSB-&GT; LSB到LSB-&GT; MSB)