位移運算符
<< 位左移
左移運算的實質是將對應的數據的二進制值逐位左移若干位,並在空出的位置上填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,判斷完以后,讓前面的右移一位即可。