前幾天寫了一篇關於c#位操作,c#位運算基本概念與計算過程
最後提到乙個實際問題
需求:高16位用short,中間32位用int,最低16位用另外乙個short。
答案:((long)shorta << 48 )+ ((long)inta << 16)+ shortb
具體的計算過程是這樣的
距離shorta 是 17,inta是8,shortb是20
17是short型別 16位的二進位制
0000 0000 0001 0001
8是int型別 32位的二進位制
0000 0000 0000 0000
0000 0000 0000 1000
20是short型別 16位的二進位制
0000 0000 0001 0100
從這個三個二進位制就可以得出long型別的64位二進位制,long值是4785074604605460
0000 0000 0001 0001
0000 0000 0000 0000
0000 0000 0000 1000
0000 0000 0001 0100
step1:將shorta 17的二進位制左位移48位也就是這個long型別最左邊16位(17一定要先轉成long再左位移,一定要記住這一點)
(long)17<<48 的結果是4785074604081152 17乘以2的48次方法
2的49次方(第乙個1在49位)加上2的53次方(第二個1在53位)
17的64位二進位制
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0001 0001
向左移動48位後
0000 0000 0001 0001
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
step2:8的二進位制左移16位,(long)8<<16的結果是:524588
8的64位二進位制
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 1000
向左移動16位後
0000 0000 0000 0000
0000 0000 0000 1000
0000 0000 0000 0000
0000 0000 0000 0000
step3 :
(long)17<<48 +(long)8<<16 =4785074604081152 +524588
有效位數已經佔滿了前48位,剩下的有效16位就是20
最終的結果就是
((long)8<<16)+((long)17<<48)+20 =4785074604605460
完美三部曲,幹就完事了。
step1:首先要獲取前16位有效值shorta
我們已經知道了longresult 4785074604605460的64位二進位制
0000 0000 0001 0001
0000 0000 0000 0000
0000 0000 0000 1000
0000 0000 0001 0100
將這個long型別往右移動48位得到的64位二進位制,也就是16位有效值shorta,這個short就是17
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0001 0001
longresult >>48完美得到shorta的值17,右位移也就是longresult整除2的48次方
shorta =(short)(longresult<<48)
step2:然後獲取中間32位inta的值,先將這個longresult右位移16位,得到後48位有效值
0000 0000 0000 0000
0000 0000 0001 0001
0000 0000 0000 0000
0000 0000 0000 1000
現在要取的後面32位有效值才是inta的值,再將(longresult>>16)&0xffffffff,做邏輯與運算,0xffffffff(4294967295)的64位二進位制全部都是1
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1111 1111
1111 1111 1111 1111
與運算的規則1&1=1 、1&0=0、0&0=0,所以對後48位有效值做完邏輯與運算,就得到有效32位的inta
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 1000
inta=(int)((longresult>>16)&0xffffffff)
inta的最終結果就是8
step3:最後獲取最右邊16位的shortb(將前面48位都變成0),只需要做一次與運算就可以,longresult做與運算的物件是0xffff(65535),有效16位全部都是1,二進位制如下
0000 0000 0000 0000
0000 0000 0000 0000
1111 1111 1111 1111
1111 1111 1111 1111
longresult&0xffff的最終結果就是20
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0000 0000
0000 0000 0001 0100
shortb=(short)(longresult&0xffff)=20;
高16位用short,中間32位用int,最低16位用另外乙個short。
longresult=((long)shorta << 48 )+ ((long)inta << 16)+ shortb
根據longresult獲取前16位shorta,中間32位inta,後16位shortb
shorta=(short)(longresult>>48)
inta=(int)((longresult>>16)&0xffffffff)
shortb=(short)(longresult&0xffff)
那麼
想用乙個byte存兩個數,如何相互轉換?
如何獲取和設定乙個int的二進位制位?
知道計算過程和位運算的基本概念,這些問題就非常簡單,會者不難,難者不會。
小結 c 位運算的運用
去掉最後一位 101101 10110 x 1 在最後加乙個0 101101 1011010 x 1 在最後加乙個1 101101 1011011 x 1 1 把最後一位變成1 101100 101101 x 1 把最後一位變成0 101101 101100 x 1 1 最後一位取反 101101 ...
位運算在 PHP 實際專案當中的運用
來回顧一下這些基礎知識,同時也會講位運算在 php 實際專案當中的高階技巧。一 位運算知識回顧 php 手冊當中,專門對位運算及位運算子進行了使用介紹。按位與運算子 之所以稱為位運算,指的是在運算過程中,我們會把兩組需要位運算的數值進行二進位製化,然後兩組二進位制的數字從低位向左對齊。這裡的位指的是...
位運算在 PHP 實際專案當中的高階運用
我們首先來看乙個系統中常見的需求 有乙個廣告表,我們要對廣告做顯示控制 可能的表結構如下 create table finger ad ad id int 11 unsigned not null auto increment comment 主鍵 ad name varchar 50 not nu...