作為乙個開發人員,在看別人專案或者看第三方庫的源**時,可能經常會看到譬如a>>4&0x0f這樣的寫法,對於一些初入行的童鞋來說可能就不是太明白這是什麼意思。下面我們就來講解這幾個運算子的實際用途。
運算子含義
描述<<
左移用來將乙個數的各二進位制位全部左移n位,高位捨棄,低位補0。
>>
右移將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數,高位補0。
&按位與
如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。
|按位或
兩個相應的二進位制位中只要有乙個為1,該位的結果值為1,否則為0。
1.清零
若想對乙個儲存單元清零,即使其全部二進位制位為0,只要對這個儲存單元當前的值取反(也就是原來的數中為1變為0,0變為1),然後使二者進行&運算,即可達到清零目的。
比如a=23,b=~a:
a:00010111
b:11101000
a&b:00000000
2.取乙個數中某些指定位
比如a=23,我想取a的二進位制的後面4位數,那麼可以找乙個後4位是1其餘位是0的數b,即b=0x0f(十六進製制,轉換為二進位制為00001111),a&b就得到了a的後四位。
a:00010111
b:00001111
a&b:00000111
3.保留指定位
比如a=23(用8bit表示),我想保留其二進位制的第4和第6位(最左邊為第1位),其餘位置0。那麼可以找乙個第4和第6位是1其餘位是0的數b與a進行按位與運算
a:00010111
b:00010100
a&b:00010100
常用來對乙個數的某些位置1,其餘位不變。比如a=23,我想將其第2和第3位置為1,可以找乙個第2、3位是1其餘位是0的數與a進行按位或運算。
a:00010111
b:01100000
a|b:01110111
在實際專案中,很多時候&和|都是和》、《配合使用的。比如在藍芽專案開發中,2個裝置之間進行日期資料傳輸時,我們先定乙個協議,用4個byte來表示乙個日期,其中byte0表示年份的高位數,byte1表示年份的低位數,byte2表示月份,byte3表示日期。
裝置端現在收到另外一台裝置傳過來的日期資料00010100 00010011 00000110 00011101(為了閱讀方便我將每個byte之間用空格分開)。那麼我要如何解析這個資料來得到實際日期呢?
/*
*第一步,獲取日期。
*日期是最後乙個byte,也就是最後8位,用乙個後8位是1其餘位是0的數(11111111,十六進製制表示是0xff)與資料進行按位與計算即可
*/date = 00010100 00010011 00000110 00011101;
day = date & 0xff;(計算結果是00011101,十進位制表示是29,也就是日期是29)。
/* *第二步,獲取月份。
*月份是倒數第2個byte,此時需要先將最後乙個byte砍掉(也就是右移8位),然後再和0xff進行按位與運算
*下面**可以簡寫成date=date>>8&0xff;
*/date = date>>8; (計算結果是00010100 00010011 00000110)
month = date & 0xff;(計算結果是00000110,十進位制表示是6,也就是月份是6月)。
/* *第三步,獲取年份低位。
*先將最後乙個byte砍掉(也就是右移8位),然後再和0xff進行按位與運算
*下面**可以簡寫成date=date>>8&0xff;
*/date = date>>8; (計算結果是00010100 00010011)
year_low = date & 0xff;(計算結果是00010011,十進位制表示是19)。
/* *第四步,獲取年份高位。
*先將最後乙個byte砍掉(也就是右移8位),然後再和0xff進行按位與運算
*下面**可以簡寫成date=date>>8&0xff;
*/date = date>>8; (計算結果是00010100)
year_heigh = date & 0xff;(計算結果是00010011,十進位制表示是20)。
最後將4個數拼起來就得到日期為2023年6月29日。 C語言中》 的實際用途
運算子 含義描述 左移用來將乙個數的各二進位制位全部左移n位,高位捨棄,低位補0。右移將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數,高位補0。按位與 如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0。l按位或 兩個相應的二進位制位中只要有乙個為1,該位的結果值為1,...
C語言中const有什麼用途
const修飾的資料型別是指常型別,常型別的變數或物件的值是不能被更新的。const關鍵字的作用主要有以下幾點 1 可以定義const常量,具有不可變性。例如 const int max 100 int array max 3 可以避免意義模糊的數字出現,同樣可以很方便地進行引數的調整和修改。4 可...
C語言中遞迴的實際應用與經典問題
目錄 遞迴簡單的來說就是在函式中呼叫自己 它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的程式設計客棧問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。遞迴的兩個必要條件 存在限制條件,當滿足這個限制條件的時候,遞迴便不再繼續。每次遞迴...