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