编程语言
首页 > 编程语言> > C++ 打印数据二进制bit位,以及对位操作的思考

C++ 打印数据二进制bit位,以及对位操作的思考

作者:互联网

近日,因工作需要,将Python解析结构体bytes转换成0和1表示,为了验证结果是否和C++的一致,

需要C++写一个内存数据从低字节到高字节用0和1来表示demo。

 

#include <iostream>

using namespace std;
int main()
{
    int a;
    do
    {
        cout << "Please input a int !=0:\n";
        cin >> a;
        if (a)
        {
           
            for (int i = 0; i < 4; i++)
            {
                unsigned char *ch_p = (unsigned char *)&a + i;
                unsigned char ch = *ch_p;
                for(int j=0; j<8; j++)
                {
                    if (ch &(1 << (7-j)))
                    {
                        cout << "1";
                    }
                    else
                    {
                        cout << "0";
                    }

                }
                cout << "  ";

            }
            cout << endl;
        }

    }
    while (a);

    return 0;
}
View Code

 

 

 

 从结果来看方法一 和Windows 计算器转换的一致,都是大端的表示方式。

而方法二的输出结果和方法一,字节显示刚好相反,符合Windows 小端的预期。

从方法一的结果错误的原因:

将待计算的n 内存4个字节,共32位 从第到高排序,

分别记为32,31,30, 29,...,1位。

32个位分别构造当前位为1,其他位为0的整数,与之进行&操作,来判断当前位是0 还是1。

在小端的机器上,当进行按位取与操作时, 1 左移位数操作大于8位时,比如1 << 9, 此时,1并不在第9位上。

而是位于左侧第16位,即第17位上。因此无法输出正确的内存表示。

 

标签:位操作,ch,int,32,unsigned,C++,char,bit
来源: https://www.cnblogs.com/daoist/p/13657755.html