移位運算符,是效率很高一種運算符,是用於二進制運算,我們編的程序最終都是二進制的,所以 在編碼過程中,我們可以把移位運算符用於所有進制,但它是基於二進制的運算。
在二進制數碼中,位於更左邊的數,所占的權值更高,也就是它所代表的數值越大,所以左移運算符,其實是把二進制數中的各個數位向左移動一位,最右邊剩出來的末尾補零,
這樣就把這個數擴大成原來的一倍,也就相當於乘以2了,因為二進制的一個數的基數是2,你可以想想10進制的基數是10,把10往左移一位是不是就變成100了,也就是乘以了這個基數10,
如果對二進制這種算法懷疑,可以算算試試。
右移也就是把二進制各個數位位向右邊推一位,最后就相當於除以2了。
與操作符,是兩個數 化為二進制位,右邊對齊,左邊補零,各列的數位兩兩相與,1與0得0, 1與1得1 ,0與1得0。
這樣與了之后,就保證這個數不超過0xff,剛好是一個Byte字節能表示的范圍。
1個16進制數,相當於4位的二進制數,因為4位二進制數剛好可以表示完一個16進制數。
我們知道這些知識之后,就能把一個整數轉換成高字節和低字節的數組了。
int num = 86400; string numHex = "15180"; byte b1 = (byte)((num >> 16) & 0xff); byte b2=(byte)((num >> 8) & 0xff); byte b3= (byte)(num & 0xff); Console.WriteLine(numHex); Console.WriteLine(b1 + "="+b1.ToString("x")); Console.WriteLine(b2 + "=" + b2.ToString("x")); Console.WriteLine(b3 + "=" + b3.ToString("x"));
比如,這段程序,86400是十進制值,15180是16進制時的值。在這里 num>>16位,相當於把15180向右邊推動4個位置,因為一個16進制位相當於4個二進制位,右移16,就16/4=4,
也就是4個16進制位,也就是把5180抹掉 剩下1,然后1&0xff,0xff代表8個1 與00000001 一與最后就是1。
剩下的都是同樣的道理。
需要注意的是,b2右移8位,剩下的是151,但為什么最后是51呢,原因是與的0xff,相當於0x0ff,最高位1與0與得0,5與f=5 1與f=1,可以試試與0xfff就會是151了。
當需要移動一位 一位的16進制碼組成高低字節數組,就可以每次右移4位,與上0xf。