昨天寫了乙個關於位運算的困擾,今天又學習了一下才知道自己是多麼的無知和愚蠢。
昨天的困惑:
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...