本文目錄一覽:
- 1、php 里的位運算符怎麼算的
- 2、在位邏輯中,或與異或的區別。
- 3、PHP語言PHP語言里的位運算符&、|、^ 、~、〈〈 、〉〉這些符號我一個也不懂,希望高手給個全面的解釋!拜
- 4、php 簡單的異或運算
- 5、php小白 請問與 或 異或 取反是什麼意思?
- 6、位運算總結(按位與,或,異或)
php 里的位運算符怎麼算的
位運算,顧名思義就是按二進制位進行運算。首先應該熟悉基本的位預算法則:01=0,11=1,0|1=1,0^1=1,1^1=0,~0=1等等。如果$m = 3(011) ; $n = 5(101) ;則m與n之間的位預算都是先將十進制數轉換為二進制數後,按對應為上的0或1進行相應的運算,比如$mn = $n $m = 011 101 = 001即十進制的1,其它的以此類推。這下你應該明白了
在位邏輯中,或與異或的區別。
1、運算規則不同:
異或如果a、b兩個值不相同,則異或結果為1。如果a、b兩個值相同。異其運算法則相當於不帶進位的二進制加法:二進制下用1表示真,0表示假,則異或的運算法則為:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同為0,異為1),這些法則與加法是相同的,只是不帶進位,所以異或常被認作不進位加法。
2、功能不同:
按位或其功能是參與運算的兩數各對應的二進位相或。異或結果為0。或只要對應的二個二進位有一個為1時,結果位就為1。當參與運算的是負數時,參與兩個數均以補碼出現。
3、運算符不同:按位或在C語言中用a | b表示。按位異或在C語言中用a ^ b來表示。
擴展資料:
位運算相關規則:
1、整數在計算機中用二進制的位來表示,C語言提供一些運算符可以直接操作整數中的位,稱為位運算,這些運算符的操作數都必須是整型的。
2、1 1 = 1, 1 | 1 = 1, 1 ^ 1 = 0
3、1 0 = 0, 1 | 0 = 1, 1 ^ 0 = 1
4、0 1 = 0, 0 | 1 = 1, 0 ^ 1 = 1
5、0 0 = 0, 0 | 0 = 0, 0 ^ 0 = 0
參考資料來源:百度百科-位運算
PHP語言PHP語言里的位運算符&、|、^ 、~、〈〈 、〉〉這些符號我一個也不懂,希望高手給個全面的解釋!拜
“” 按位與運算
按位與運算符””是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。
例如:95可寫算式如下:
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。
例如:
a4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
?php
$a = 3;
$temp = $a4;
echo sprintf(“%d”, $temp).”\n”; //十進制
「」 右移運算
右移運算符「」是雙目運算符。其功能是把「 」左邊的運算數的各二進位全部右移若干位,「」右邊的數指定移動的位數。
例如:
設 a=48,
a4
表示把00110000右移為00000011(十進制3)。
應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定
?php
$a = 48;
$temp = $a4;
echo sprintf(“%d”, $temp).”\n”; //十進制
php 簡單的異或運算
異或一下可求出。
?php
function showXor($a, $b){
$c=$a^$b;
printf(‘%x xor %x = %x br/’,$a,$c,$b);
}
showXor(0xe79a, 0xc97a);
showXor(0xe520, 0xc520);
e79a xor 2ee0 = c97a
e520 xor 2000 = c520
php小白 請問與 或 異或 取反是什麼意思?
這些是數學邏輯運算,並不是PHP才有,這裡涉及到一個布爾型數據類型的含義(真則為1,假則為0)
舉個例子,假設有條件a和條件b
與關係:變量$c = $a $ b,只有$a與$b兩個條件都滿足時($a為真,判斷結果等於1;且$b為真,判斷結果等於1),c才為真($c = 1),否則c為假($c = 0)
或關係:變量$c = $a ||$ b,只要$a或者$b有其中一個滿足時($a真$b假,$a假$b真,$a真$b真),$c為真
異或關係:變量$c = $a ^ $b,只要$a、$b條件判斷結果不同($a真$b假,$a假$b真),則$c為真
取反:$c = !$a,當條件$a為真($a = 1)則$c = 0;$a為假($a = 0)則$c = 1;
位運算總結(按位與,或,異或)
參加運算的兩個數據,按二進制位進行「與」運算。
運算規則:00=0; 01=0; 10=0; 11=1;
即:兩位同時為「1」,結果才為「1」,否則為0
例如:35 即 0000 0011 0000 0101 = 00000001 因此,35的值得1。
另,負數按補碼形式參加按位與運算。
「與運算」的特殊用途:
(1)清零。如果想將一個單元清零,即使其全部二進制位為0,只要與一個各位都為零的數值相與,結果為零。
(2)取一個數中指定位
方法:找一個數,對應X要取的位,該數的對應位為1,其餘位為零,此數與X進行「與運算」可以得到X中的指定位。
例:設X=10101110,
取X的低4位,用 X 0000 1111 = 00001110 即可得到;
還可用來取X的2、4、6位。
參加運算的兩個對象,按二進制位進行「或」運算。
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運算的兩個對象只要有一個為1,其值為1。
例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。
另,負數按補碼形式參加按位或運算。
「或運算」特殊作用:
(1)常用來對一個數據的某些位置1。
方法:找到一個數,對應X要置1的位,該數的對應位為1,其餘位為零。此數與X相或可使X中的某些位置1。
例:將X=10100000的低4位置1 ,用X | 0000 1111 = 1010 1111即可得到。
參加運算的兩個數據,按二進制位進行「異或」運算。
運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:參加運算的兩個對象,如果兩個相應位為「異」(值不同),則該位結果為1,否則為0。
「異或運算」的特殊作用:
(1)使特定位翻轉找一個數,對應X要翻轉的各位,該數的對應位為1,其餘位為零,此數與X對應位異或即可。
例:X=10101110,使X低4位翻轉,用X ^0000 1111 = 1010 0001即可得到。
(2)與0相異或,保留原值 ,X ^ 00000000 = 1010 1110。
下面重點說一下按位異或,異或其實就是不進位加法,如1+1=0,,0+0=0,1+0=1。
異或的幾條性質:
1、交換律
2、結合律(即(a^b)^c == a^(b^c))
3、對於任何數x,都有x^x=0,x^0=x
4、自反性: a^b^b=a^0=a;
異或運算最常見於多項式除法,不過它最重要的性質還是自反性:A XOR B XOR B = A,即對給定的數A,用同樣的運算因子(B)作兩次異或運算後仍得到A本身。這是一個神奇的性質,利用這個性質,可以獲得許多有趣的應用。 例如,所有的程序教科書都會向初學者指出,要交換兩個變量的值,必須要引入一個中間變量。但如果使用異或,就可以節約一個變量的存儲空間: 設有A,B兩個變量,存儲的值分別為a,b,則以下三行表達式將互換他們的值 表達式 (值) :
a=a^b;
b=b^a;
a=a^b;
應用舉例1:
1-1000放在含有1001個元素的數組中,只有唯一的一個元素值重複,其它均只出現
一次。每個數組元素只能訪問一次,設計一個算法,將它找出來;不用輔助存儲空
間,能否設計一個算法實現?
解法一、顯然已經有人提出了一個比較精彩的解法,將所有數加起來,減去1+2+…+1000的和。
這個算法已經足夠完美了,相信出題者的標準答案也就是這個算法,唯一的問題是,如果數列過大,則可能會導致溢出。
解法二、異或就沒有這個問題,並且性能更好。
將所有的數全部異或,得到的結果與1^2^3^…^1000的結果進行異或,得到的結果就是重複數。
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a 2將a的二進制位左移2位,右補0,
左移1位後a = a *2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a 2 將a的二進制位右移2位,
左補0 or 補1得看被移數是正還是負。
如果兩個不同長度的數據進行 位運算 時,系統會將二者按右端對齊,然後進行 位運算 。
以「與」運算為例說明如下:我們知道在C語言中long型佔4個位元組,int型佔2個位元組,如果一個long型數據與一個int型數據進行「與」運算,右端對齊後,左邊不足的位依下面三種情況補足,
(1)如果整型數據為正數,左邊補16個0。
(2)如果整型數據為負數,左邊補16個1。
(3)如果整形數據為無符號數,左邊也補16個0。
如:long a=123;int b=1;計算a b。
如:long a=123;int b=-1;計算a b。
如:long a=123;unsigned intb=1;計算a b。
原創文章,作者:WHGG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/143482.html
微信掃一掃
支付寶掃一掃