码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-09-17 23:13:26      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:lease   isp   main   数据   demo   clu   div   none   spl   

近日,因工作需要,将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位上。因此无法输出正确的内存表示。

 

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

标签:lease   isp   main   数据   demo   clu   div   none   spl   

原文地址:https://www.cnblogs.com/daoist/p/13657755.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!