二進位製取位操作。(愚蠢的人 書到用時方恨少)

2021-10-19 10:12:58 字數 1030 閱讀 2998

昨天寫了乙個關於位運算的困擾,今天又學習了一下才知道自己是多麼的無知和愚蠢。

昨天的困惑:

16進製制數:0x06aa4c

換算成24位2進製數:000001101010101001001100

資料定義:

//0~4 共5bit 春節日份

//5~6 共2bit 春節月份

//7~19 共13bit 13個月的大小月情況(如果無閏月,最後位無效),大月為1,小月為0

//20~23 共4bit 記錄閏月的月份,如果沒有閏月為0

進行取位運算得到月份和日期:

//計算春節的公曆日期

int spring_ny_month = ( lunar_years[year_index] & 0x60 ) >> 5;  //取月份

int spring_ny_day = ( lunar_years[year_index] & 0x1f);  //取日期

我的疑惑為什麼第一行能取到月份?為什麼第二行能取到日期?

愚蠢的我所犯的錯誤:

000001101010101001001100把這個二進位制數的左邊當做低位。這是錯誤的根本。右邊才是低位,那一切問題就都解決了。

0x60的二進位制是01100000與上面的24位數進行位與運算,後再右移5位即得到24位數中的第6、7位,即月份,與原資料定義是相符的。日期的演算法也就清楚了。

注:二進位制的取位操作  (原理很容易理解,我卻不知道)

邏輯與運算:兩個數都為1時結果為1。

想取哪幾位把那幾位進行和1進行與運算,再移位即可。

如上面月份的計算:與0x60(二進位制01100000)進行與運算,因為是第6、7位,所以要再右移5位。

日期計算:與0x1f(二進位制:00011111)進行與運算,因為在最右邊5位,所以不用移位。

二進位制 位操作運算子

1,二進位制 資料在記憶體中是用二進位制儲存的,二進位制是指由0,1兩個元素組成。其常見的編碼方式有三種 原碼,反碼,補碼 2 位 記憶體中最小儲存單元是位,也稱為bit。常常用8個bit儲存乙個字元,即1byte 8bit。3 位操作 是指cpu對記憶體中的二進位制數進行操作。包括 與 或 異或 ...

常見的二進位制位的變換操作

去掉最後一位 101101 10110 void part1 unsigned int a 在最後加乙個0 101101 1011010 void part2 unsigned int a 在最後加乙個1 101101 1011011 void part3 unsigned int a 把最後一位變...

JAVA 學習 二進位制位操作符

按位與運算子 參加運算的兩個資料,按二進位制位進行 與 運算。運算規則 0 0 0 0 1 0 1 0 0 1 1 1 即 兩位同時為 1 結果才為 1 否則為0 例如 3 5 即 0000 0011 0000 0101 0000 0001 因此,3 5的值得1。另,負數按補碼形式參加按位與運算。i...