今天看了一篇關於位操作的文章,用在這裡自己寫出來,呵呵,當成是我的第一篇小記吧...
比如下面的程式:
一 左移:
var a:int = 2;
a*a = 4
等價於:
a<<1
然後得自己分析一下這個東西的原理
2 的十六進製制是 00000000 00000000 00000000 00000010(t t 好多個零...)
然後如果向前左動一位的話就是 00000000 00000000 00000000 00000100
那麼就是等於 4
以此類推就是
a<<2 => a*4
得出規律:
向左移多少位就是乘以多少個2;
這樣的效率會高許多...
第二 右移
var a:int = 2;
a/2 等價於a>>1;
這個直接給出結論好了
這個和向左的位移有點像,不過功能就是相反,是除以2...
第三 判斷是否為偶數
var a:int = 2
如果(a&1)==0的話就是偶數了,為什麼呢?因為在(這裡是16進製制)中,偶數的最後一位一定不是1的,所以我們操作的時候用與運算子的話,
就會把後面的前面的非零的位數給變成零,然後因為是偶數,所以最後一位也是零,奇數的話就是1了,呵呵,描述不是很清楚,得舉個例子:
比如:0010 2
& 0001 1
第四 絕對值的啦
這個的位運算子是看不懂啦,
所以就貼出他的好了
忘記 math.abs()吧 (forget math.abs() for time critical code.)
version 1 比 math.abs() 快了2500% ,version 2 居然比 version 1 又快了20% !
//version 1
i = x < 0 ? -x : x;
//version 2
i = (x ^ (x >> 31)) - (x >> 31);
呵呵,以上是學習那篇文章的小小心得...
位運算學習筆記
1.補碼 補碼是為了表示乙個負數的二進位制形式。其轉化方式是,先將負數當成正數,轉化成二進位制的形式,再將二進位制正數的各個位上取反,再加上 例如 5先求出5的二進位制數 0000 0000 0101 然後將各個位上0變1 1變0 1111 1111 1010 最後再加1 1111 1111 101...
位運算學習筆記
要明白位運算是在二進位制中的運算方式,所有其他進製的數在進行位運算時都要先轉化成二進位制數再進行運算。int 是 32位二進位制。有符號整型 正數 0 負數 1 1 00000.0001 1 10000.00011.按位與 只有當x,y都是1的時候,運算結果才是1,其餘情況都是0.1 1 1 1 0...
位運算學習筆記
1 二進位制最高位是符號位 0代表正數,1代表負數 2 正數的原碼 反碼 補碼都相同 3 負數的反碼是將原碼符號位不變,其他位取反。4 負數的補碼是將反碼 1 5 0的原碼 補碼都是0 6 計算機中是依據補碼進行計算的。7 練習 1 2 例題說明 對2按位取反。由於2為正數,正數的原碼 補碼相等。所...