c++ - 二进制字符串向后打印

标签 c++ printing binary bit

我试图寻找一种使用宏使变量的位表示起作用的方法。该代码向后打印二进制字符串,因为我对 c++ 比较陌生,我认为索引是问题所在,因为它需要从高位开始,然后倒数。

#include <iostream>
#include <memory>
#include <climits>


#define EXTRACTBIT(ith,ch)(std::cout<<((*ch >> ith) & 1 ? 1 : 0))

template < typename T > void printlnbits (T v)
{
    const int s = sizeof (T) * CHAR_BIT;
    auto const bytes_begining{reinterpret_cast<unsigned char const *>(std::addressof(v))};
    auto byte{bytes_begining};
    auto bit_index_in_byte{0};
    for (int n = s - 1; n >=0; --n)
    {
        EXTRACTBIT(bit_index_in_byte, &(*byte));
        ++bit_index_in_byte;
        if (CHAR_BIT == bit_index_in_byte){
            std::cout << " ";
            bit_index_in_byte = 0;
            ++byte;
        }
    }
    std::cout << "  " << s << " bits" << std::endl;
}

int main ()
{
    const char a = 'a';
    const char b = 2;
    printlnbits (a);
    printlnbits (b);

    return 0;
}

结果:

bit_index_in_byte = 0;
++bit_index_in_byte;
10000110  8 bits //correct 01100001
01000000  8 bits //correct 00000010 

bit_index_in_byte = 8;
--bit_index_in_byte;
00110000   8 bits //correct 01100001
00000001   8 bits //correct 00000010

我尝试过失败,第一个是正确的但落后,另一个是不正确的。我还想补充一点,任何帮助或其他简化解决方案的建议将不胜感激

最佳答案

正如评论中提到的 -500 ,如果你像这样以 7 开头,你应该得到正确的结果

 auto bit_index_in_byte{7};
    for (int n = s - 1; n >=0; --n)
    {
        EXTRACTBIT(bit_index_in_byte, &(*byte));
        --bit_index_in_byte;
        if (-1 == bit_index_in_byte)
        {
            std::cout << " ";
            bit_index_in_byte = 7;
            ++byte;
        }
    }`

结果:

01100001 8 bits
00000010 8 bits

关于c++ - 二进制字符串向后打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69521679/

相关文章:

python - Python print 使用哪个函数?

c - 用 N 个不可靠位计算 unsigned int 可能值的最快方法?

c++ - 对 vector 使用二进制搜索。

c++ - 从模板中的另一个类名派生一个类名

c++ - 代码片段的页面错误

macos - 在所见即所得 Mac 应用程序中布置用于打印的图像的最佳实践?

binary - 将 0 和 1 的二进制字符串转换为 Elixir 中的位串

c++ - int 变量不在 C++ 上重置?

c++ - 来自 testdome 的二叉搜索树

go - 告诉我这段代码 GOLANG 有什么问题