php位操作
『壹』 php 位運算中的按位取反到底什麼意思
二進制 0變1 1變0
例如00000001按位取反後11111110
『貳』 php位運算中為什麼 'a'&1=0,而不是1,a的ascii碼對應值是97,那不就是97&1=1嗎
PHP 官方文檔中, Bitwise Operator 中有一段話:
If both operands for the &, | and ^ operators are strings, then the operation will be performed on the ASCII values of the characters that make up the strings and the result will be a string. In all other cases, both operands will be converted to integers and the result will be an integer.
使用 &, | 還有 ^ 操作符的時候,只有操作符兩邊的值都是 string 的時候,才會使用 ASCII 去運算,返畝李毀回 string,其他的所有情況下,都會把值轉換成迅備 int。
你問題中的運算並非兩個值都是字元串,所以都要被轉成 int 計算。intval( 'a' ); 的結果是0,所以相當擾喊於 0 & 1
『叄』 php如何實現js的移位運算符
移位包括有符號左移(<<)、有符號右移(>>)、無符號右移(>>>),其中 js 支持三種移位,PHP只支持前兩種移位(沒查到第三種),恰好需要PHP進行無符號右移,此處實現一下。先看結果
將數字 $a 向右無符號移動 $n 位
[php] view plain
functionuright($a,$n)
{
$c=2147483647>>($n-1);
return$c&($a>>$n);
}
下面是這樣做的理由
1、有符號右移的過程
2 >> 1
2在計算機中存儲的二進製表示為
000000000 00000000 00000000 00000010
向右移動1位,高位補0
000000000 00000000 00000000 00000001
結果為1
-2 >> 1
負數的存儲是以補碼的方式存儲的(相關知識自行了解),這里簡單說明
符號位是 1,-2的表示為
100000000 00000000 00000000 00000010
補碼:除符號位外,其他位按位取反,然後 + 1
11111111 11111111 11111111 11111101
11111111 11111111 11111111 11111110
向右移動1位,高位補1
11111111 11111111 11111111 11111111
結果為 -1(轉換成10進制後)
注意:移位操作是按照計算機中實際存儲的二進制形式進行移動的
2、無符號右移的過程
2 >> 1同上
-2 >> 1
補碼右移1位,高位補 0
01111111 11111111 11111111 11111111
結果是 2147483647
無符號右移 n 位,即把所有位向右移動 n 位(有符號右移),然後把前 n 位變成 0。
要把前 n 位變成 0 ,只需要讓其跟一個前 n 位是 0,後 32-n 位是 1 的數進行按位與就可以了。
構造前 n 位是 0 後 32-n 位是 1 的數:利用正數有符號右移高位補 0 實現,這里用 2147483647 這個正數實現(當然其他數也可以),這個數在計算機中的存儲前面已經說了,是
01111111 11111111 11111111 11111111
利用這個數構造前 n 位是 0 的數,只需將其向右移動 n-1 位就行了
-2 無符號右移 2位的過程
-2右移2位:11111111 11111111 11111111 11111111
構造數: 00111111 11111111 11111111 11111111
按位與: 00111111 11111111 11111111 111111
『肆』 PHP中的位運算符--Not(按位非),怎麼在筆記本的鍵盤上輸出
shift+1左邊那個鍵
如果不行 那就是fn+shift+1左邊那個鍵
『伍』 php中兩個整型數組能不能進行按位或運算(就像c語言和matlab的&運算符一樣)舉個例子吧,這
給你一個與運算的,或運算的直接改一下&=>||
functiona($ar,$br){
foreach($aras$key=>$value){
$cr[]=$value&$br[$key];
}
return$cr;
}
$ar=array(0,0,1,1);
$br=array(1,0,1,0);
print_r(a($ar,$br));
『陸』 位(bit)運算
一、二進制:所謂二進制就是逢二進一 (0,1), 因為使用二進制只有 0, 1 兩個數,簡單,易於電子方式實現 , 同時,通過0,1 組合可以表示任意一個數.
二進制有三個重要的概念:
1.原碼
用二進制來表示一個數,這個碼就是原碼.
1 ------> 原碼 00000000 0000000 0000000 00000101 = 1 2的零次方+0 2的一次方+1* 2的二次方=1+0+4=5
2.負數的反碼=它的原碼符號缺猛位不變,其它位取反(0->1,1->0)
反碼(正數的反碼和它的原碼一樣 , 負數反碼 是 符號位不變其它位取反)
補碼(正數的補碼和它的原碼一樣,負數的補碼是 它的反碼+1)
舉例
-1
-1的原碼 10000000 00000000 00000000 00000001
-1的反碼 11111111 11111111 11111111 11111110
-1 的補碼 11111111 11111111 111111111 11111111
3. 在計算機運算的時候,都是以補碼的方式來運算的
4+5=>計算機 4-5=4+(-5)
這句話意思就是,不管一個數是正數還是負數,都要被轉成補碼,然後進行運算.
位運算一覽表:
該圖的前面四個是位運算
其運算規則是:
按位與&:兩位全為1,結果為1
按位或| : 兩位有一個為1,結果為1
按位異或 ^ : 兩位一個為0,一個為1,結果為1
按位取反 : 0->1 ,1->0
<h3>求解:~2=?</h3>
步驟 : 首先要求出 2的補碼
2是正數 所以 原碼=反碼=補碼
2 原碼
00000000 00000000 00000000 00000010
~2
11111111 11111111 11111111 11111101 (補碼)->原碼
? 負數的 原碼-》反碼-》補碼
11111111 11111111 11111111 11111101->
推出其反碼 (對補碼-1)
11111111 11111111 11111111 11111100
推出原碼
10000000 00000000 00000000 0000011 -> -3
~-5=?
-5 的 補碼找出來.
-5 原碼 10000000 00000000 00000000 00000101
-5 反碼 11111111 11111111 11111111 11111010
-5 補碼 11111111 11111111 11111111 11111011
~-5取反 00000000 00000000 00000000 00000100 (補碼)
4
3 的補碼 00000000 00000000 00000000 00000011
2&3 00000000 00000000 00000000 00000010 [補碼]
2 的補碼 00000000 00000000 00000000 00000010
3 的補碼 00000000 00000000 00000000 00000011
2^3 00000000 00000000 00000000 00000001
二:位移運算:在php 中位運算有兩種 >> (右移) << (左移)
運算的規則是 :
算術右移:低位溢出,符號位不變,並用符號位補溢出的高位
算術左移: 符號位不變,低位補0
根悶宴據我們前面的規范,來完成幾個案例
$a=1>>2;
1 的補碼
00000000 00000000 00000000 00000001
1>>2
00000000 00000000 00000000 00000000
$b=-1>>2;
$c=1<<2;
1<<伏罩橋2
1的補碼
00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000100
『柒』 大牛! 【php 位運算】 -2&-3 等於-4 這個事怎麼算出來的
你這樣算
-2的補碼 & -3的補碼 =(1111 1110)2 & (1111 1101 )2 =(1111 1100)2
減一取反得原碼 1111 1011 原碼1000 0100
(1000 0100)2 =(-4)10
『捌』 php中的運算符有哪些
A選項,看下圖:
不用全部記住,記住平時比較常用的就行了,還有記住:算術運算符>關系運算符>邏輯運算符>賦值運算符。
(8)php位操作擴展閱讀:
PHP 中的運算符分為:四則運算符、邏輯運算符、三目運算符和位運算符。
運算符優先順序指定了兩個表達式綁定得有多「緊密」。例如,表達式 1 + 5 * 3 的結果是 16 而不是 18 是因為乘號(「*」)的優先順序比加號(「+」)高。
必要時可握棗以用括弧來強制改變優先順序。例如:(1 + 5) * 3 的值為 18。如果運算符優先順序相同,則使用從左到右的左聯順序。
對字元串和數字進褲皮慎行加胡敬法運算。
請看這些例子:
x = 5 + 5; document.write(x); x = "5" + "5"; document.write(x); x = 5 + "5"; document.write(x); x = "5" + 5; document.write(x)。
x = 5 + 5; document.write(x); x = "5" + "5"; document.write(x); x = 5 + "5"; document.write(x); x = "5" + 5; document.write(x)。
『玖』 PHP語言PHP語言里的位運算符&、|、^ 、~、〈〈 、〉〉這些符號我一個也不懂,希望高手給個全面的解釋!拜
"&" 按位與運算
按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下:
00001001 (9的二進制補碼)
&00000101 (5的二進制補碼)
00000001 (1的二進制補碼)
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a&$b);
?>
"|" 按位或運算
按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:
00001001
|00000101
00001101 (十進制為13)可見9|5=13
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a|$b)."\n"; //二進制
echo sprintf("%d", $a|$b)."\n"; //十進制
"^" 按位異或運算
按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:
00001001
^00000101
00001100 (十進制為12)
<?php
$a = 9;
$b = 5;
echo sprintf("%b", $a^$b)."\n"; //二進制
echo sprintf("%d", $a^$b)."\n"; //十進制
"~" 求反運算
求反運算符~為單目運算符,具有右結合性。其功能是對參與運算的數的各二進位按位求反。
例如~9的運算為:
~(0000000000001001)結果為:1111111111110110
<?php
$a = 9;
$b = 5;
echo sprintf("%b", ~$a)."\n"; //二進制
"〈〈" 左移運算
左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。
例如:
a<<4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
<?php
$a = 3;
$temp = $a<<4;
echo sprintf("%d", $temp)."\n"; //十進制
「>>」 右移運算
右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:
設 a=48,
a>>4
表示把00110000右移為00000011(十進制3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定
<?php
$a = 48;
$temp = $a>>4;
echo sprintf("%d", $temp)."\n"; //十進制
『拾』 php 的位運算總結
php的位運算很少會用到,但是用處很大,
在有些演算法中會用到,在許可權管理中也會經常用到,
對於理解計算機的世界也會有一定的幫助,所以得把這些重要但不常用的東西總結一下記錄一下。
提到位運算,避不開的是二進制。
因為位運算是直接在內存做操作和運算,相較與直接拿兩個變數做運算符肯定是更快的。
很多地方把二進制這玩意說得很晦澀,現在來以最簡單的方式來總結一下,當然只算 int 范圍內的數算了,超過了這個范疇程序員還不如拿這時間去學點別的。
說完以上總結,再來解釋下什麼是二進制,網上大把,
但只要記住,int范圍內的數也就是我們大部分需要用到的數,都可以用二進制來表示。
我們生活中用到的計數方式為十進制,由個數位滿10進1,
然後再開始重新計算,等十位滿9再加一時,百位加一,十位歸零。
二進制則只有兩個數字來表示就是0和1,滿2進1。
由32個位組成,雖然只有32個位但已滿足了我們正常的需求了
比如說1轉換為2進制原碼,由於1是正數所以符號位為0,
原碼反碼補碼都一個樣。
1的原碼:00000000 00000000 00000000 00000001
因手懶,太多0太丑用+拼接,Ɔ* 8'代表8個0
2的原碼:0* 8 0* 8 0* 8 0* 6 + 1 0,既然是二進制,
滿2就得進1,最低位歸0,向前加一。
再來解釋下負數的原碼反碼和補碼,就開始講php的位運算了。
二進制復習完畢。下面開始講講php的位運算。
php一共有六種位運算,一種一種來講。
可以這么理解,兩個數的補碼放在一起比較每個位(一共32個位),
可以得出另外一個數,這個數字的組成由比較的兩位數字生成,
如果兩個數的每個位數上的數字都等於1的話,
那得到的那個數的補碼的同位為1,否則為0。
聽著繞口,其實很簡單,覺得還是比官網上的更容易讓新手看懂
下面舉例子:
首先來求-1和7的補碼。7的原碼就是補碼。
兩個補碼都有了下面開始運算:
按照上面的說法, 每個位都有一樣則 $a 的同等位則為1,剛好-1的補碼和7的補碼前面都不一樣,就最後三位一樣,所以剛好求得的 $a 的補碼的最後三位是1而其他的都是0 ,剛好這個補碼為正數,正好就是7。
其實就是和按位與相反,只要有1個為1,那就為1,如果都不為1,那就為0。
$a = -1|7 ;得出來的 $a 補碼為32個1,但此時不能說 $a 就是-1,因為這只是補碼,要轉成原碼再轉成十進制數,補碼-1,然後再翻轉,再轉出來,得到的其實也還是-1。
就是將這個數的補碼全部翻轉過來,包括符號位,0變1,1變0
取反的結果一定是整數變負數負數變正數,取正數的反時,
記得一定要從補碼一步步轉到原碼再轉成十進制數才是答案。
兩個數的補碼比較,同等位上的兩數比較
,不一樣時,則答案的補碼的同位則為1,否則為0。
往左移符號位被擠走右邊0補充,往右移動,符號位不動,
高位以符號位補充。二進制世界裡往左移動其實是相當於乘以了2,
右移相當於除以了2。
不吹牛逼的說,這應該是互聯網上最容易理解的php位運算的解釋和二進制的解釋了。
原文鏈接: php的位運算總結-PHP