1. 程式人生 > 實用技巧 >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位上。因此無法輸出正確的記憶體表示。