c 差值 獲取時間 C 位運算實際運用

2021-10-13 21:39:17 字數 4283 閱讀 3450

前幾天寫了一篇關於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...