標籤:位元運算 結果 根據 數字 乘法 無符號 數位 二進位 echo
先舉兩個例子
1 $b = 10;2 $b = $b << 3;3 echo $b; //輸出 80
$b = 10;$b = $b >> 3;echo $b; //輸出 1
可以發現 左位移會乘以相應的數 而 右位移會除以相應的數 如果得出浮點數,舍掉小數位,只取整數,位移運算其實是對位元的操作
位移運算子
<< 位左移
左移運算的實質是將對應的資料的二進位值逐位左移若干位,並在空出的位置上填0,最高位溢出並捨棄。例 如
$a=10;
$b=$a<<2;
則$b=40,根據手冊描述可以看出位元運算可以看出向左移一位,則是實現乘2運算。由於位移操作的運算速度比乘法的 運算速度高很多。因此在處理資料的乘法運算的時,採用位移運算可以獲得較快的速度。
提示 將所有對2的乘法運算轉換為位移運算,可提高程式的運行效率
樣本:
以下三種表達方式是一個意思。
$a = 1024;
for($i=1; $i<$a; $i = $i+$i){
echo $i.”\n”;
}
$a = 1024;
for($i=1; $i<$a; $i = 2*$i){
echo $i.”\n”;
}
$a = 1024;
for($i=1; $i<$a; $i = $i<<1){
echo $i.”\n”;
}
>> 位右移
右移運算的實質是將對應的資料的二進位值逐位右移若干位,並捨棄出界的數字。如果當前的數為無符號數, 高位補零。例如:
$a = 25;//11001
b=a>>2;//等價於:11001 >> 01100, 01100 >> 00110.那麼110 =》 6,即25/4 = 6
b=(0000 0000 0000 0110)=6
如果當前的資料為有符號數,在進行右移的時候,根據符號位決定左邊補0還是補1。
如果符號位為0,則左 邊補0;但是如果符號位為1,則根據不同的電腦系統,可能有不同的處理方式。
可以看出位右移運算,可以實現對除數為2的整除運算。
提示 將所有對2的整除運算轉換為位移運算,可提高程式的運行效率
舉例:輸入一個整數,判斷這個數中有幾個二進位位1?例如輸入67,輸出結果應該為3。
因為67的相應位元為00000000 01000011(0043H),有3個1出現。
分析:要判斷是不是1,只需要判斷該位與1與以後是不是1就可以知道。一個整數,判斷16次即可。
main(){
int num,k;
int count=0;/* 記錄1的個數 */
scanf(%d,&num);
for(k=0;k<16;k++){
if(num&1==1) count++; /* 判斷最低位是不是1 */
num>>=1;/* num右移1位 */
}
printf(%d\n,count);
}
這樣每次都判斷最低位是不是1,判斷完以後,讓前面的右移一位即可。
轉載自 http://www.cnblogs.com/lbnnbs/p/5883799.html
PHP 的 << 和 >> 位移運算子