當前位置:首頁 » 編程語言 » php位運算

php位運算

發布時間: 2024-07-21 14:26:47

A. php位運算符理解

左移1位=>*2
右移1位=>/2

B. 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"; //十進制

C. 關於php 位運算符的問題

這個涉及到系統底層,WEB開發中幾乎沒用到,知道下有這個東西就好了。底層的東西解釋總是簡單不了的。
變數在內存中的存放都是二進制數字。整數在32位系統上是佔用4位元組,一個位元組是8位,也就是32位,位運算就是位級的運算操作了。

$a << $b Shift left(左移) 將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。
假定變數 $a 的值是 3,$b 的值是 2。
那麼 $a 在內存中的存放的格式是:
00000000 00000000 00000000 00000011
每執行一次左移,都將所有的位向左移動,右邊補零,左邊超過的舍棄。
所以 $a 左移 2 得到的是:
00000000 00000000 00000000 00011000
也就是 12。相當於 3 × 2 × 2 = 12。

$a >> $b Shift right(右移) 將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。
假定變數 $a 的值是 24,$b 的值是 2。
那麼 $a 在內存中的存放的格式是:
00000000 00000000 00000000 00011000
每執行一次右移,都將所有的位向由移動,右邊超過的舍棄,左邊空出的位補零。
所以 $a 右移 2 得到的是:
00000000 00000000 00000000 00000110
也就是 6。相當於 24 ÷ 2 ÷ 2 = 6。

位移運算是系統底層運算,運算的速度比乘除還要快很多,優化代碼優化到極致的時候,可以將數換算成二的公倍數,然後進行位移計算。但在WEB開發中幾乎沒有任何必要,而且超過系統底層了,程序在的可移植性就會降低。

其他的位運算符也是差不多的。比如:
$a & $b And(按位與) 將把 $a 和 $b 中都為 1 的位設為 1。
假定變數 $a 的值是 5,$b 的值是 6。
$a:
00000000 00000000 00000000 00000101
$b:
00000000 00000000 00000000 00000110
$a & $b :
00000000 00000000 00000000 00000101
00000000 00000000 00000000 00000110
───────────────────────────
00000000 00000000 00000000 00000100
豎的看,上下都是 1 的得到 1 ,否則就是 0。
所以 $a & $b = 4。

~ $a Not(按位非) 將 $a 中為 0 的位設為 1,反之亦然。
~ $a:
00000000 00000000 00000000 00000101
───────────────────────────
11111111 11111111 11111111 11111010
如果 $a 是有符號整數,第一位是符號位,1表示負數,那麼 ~ $a = -2147483642。
如果 $a 是無符號整數,第一位還是數據位,那麼 ~ $a = 4294967290。

以下的就不詳細介紹了:
$a | $b Or(按位或) 將把 $a 或者 $b 中為 1 的位設為 1。
$a ^ $b Xor(按位異或) 將把 $a 和 $b 中不同的位設為 1。

平常說的幾位的系統,就是系統處理整數的時候,是多少個位同時計算的,上面的例子都是基於32位系統。因為移動時超過的位將被舍棄,如果是64位或12位的,位移的結果就可能不一樣了,要將計算時位的數量調整下。

D. 在PHP中【邏輯運算符】和【位運算符】有什麼本質的區別

這個很難細說,不過和C語言中的邏輯運算符和位運算符是一樣區別的
下面給個參考(摘至某人博客):

一、邏輯運算符:

包括:1。&&邏輯與 2。||邏輯或 3。!邏輯非

邏輯運算符用於對包含關系運算符的表達式進行合並或取非

對於使用邏輯運算符的表達式,返回0表示「假」,返回1表示「真」。關於邏輯運算符的解釋

請注意:任何使用兩個字元做符號的運算符,兩字元之間不應有空格,即將==寫成= =是錯誤的。

假設一個程序在同時滿足條件a<10和b==7時,必須執行某些操作。應使用關系運算符和邏輯運算符「與」來寫這個

條件的代碼。用&&表示「與」運算符,該條件代碼如下:

(a<10) && (b==7);

類似地,「或」是用於檢查兩個條件中是否有一個為真的運算符。它由兩個連續的管道符號(||)表示。如果上例

改為:如果任一語句為真,則程序需執行某些操作,則條件代碼如下:

(a<10) || (b==7);

第三個邏輯運算符「非」用一個感嘆號(!)表示。這個運算符對表達式的真值取反。例如,如果變數s小於10,程序

程序需執行某些操作,則條件代碼如下:

(s<10)



(!(s>=10)) //s不大於等於10

關系運算符和邏輯運算符的優先順序一般都低於算術運算符。例如,5>4+3的計算與5>(4+3)運算符是一樣的,即

先計算4+3,再執行關系運算。此表達示的結果為「假」,即,將返回0。

下面的語句

printf("%d",5>4+3);

將輸出 0

可以總結為:&&的結果是真真為真。||的結果是假假為假。

二、位運算符:

包括:1。&位與符 2。|位或符 3。^位異或符 4。~位取反符

以操作數12為例。位運算符將數字12視為1100。位運算符將操作數視為位而不是數值。數值

可以是任意進制的:十進制、八進制或十六進制。位運算符則將操作數轉化為二進制,並相應地返回1或0。

位運算符將數字視為二進制值,並按位進行相應運算,運算完成後再重新轉換為數字。例如:

表達式10&15表示(1010 & 1111),它將返回表示1010的值10。因為真真得真,或者是11得1,同位全是1結果也是1

表達式10|15表示(1010 | 1111),它將返回表示1111的值15。假假得假。全零得零。

表達式10^15表示(1010 ^ 1111), 它將返回表示0101的值5。此時是同性相斥,相同的就為假。

表達式~10表示(~1010),它將返回表示0101的值 -11。此號好理解,按位取反

E. 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

F. 濡備綍鐢≒HP緙栧啓瀹炵幇涓涓綆鍗曠殑縐諱綅綆楁硶銆傛瘮濡傝達細杈撳叆ABC 杈撳嚭鐨勬槸CDE奼傚悇浣嶅ぇ紲炴寚鏁欏晩

浣嶈繍綆楀簲鐢ㄥ彛璇
娓呴浂鍙栦綅瑕佺敤涓庯紝鏌愪綅緗涓鍙鐢ㄦ垨
鑻ヨ佸彇鍙嶅拰浜ゆ崲錛岃交杞繪澗鏉劇敤寮傛垨
縐諱綅榪愮畻
瑕佺偣 1 瀹冧滑閮芥槸鍙岀洰榪愮畻絎︼紝涓や釜榪愮畻鍒嗛噺閮芥槸鏁村艦錛岀粨鏋滀篃鏄鏁村艦銆
2 "<<" 宸︾Щ錛氬彸杈圭┖鍑虹殑浣嶄笂琛0錛屽乏杈圭殑浣嶅皢浠庡瓧澶存尋鎺夛紝鍏跺肩浉褰撲簬涔2銆
3 ">>"鍙崇Щ錛氬彸杈圭殑浣嶈鎸ゆ帀銆傚逛簬宸﹁竟縐誨嚭鐨勭┖浣嶏紝濡傛灉鏄姝f暟鍒欑┖浣嶈ˉ0錛岃嫢涓鴻礋鏁幫紝鍙鑳借ˉ0鎴栬ˉ1錛岃繖鍙栧喅浜庢墍鐢ㄧ殑璁$畻鏈虹郴緇熴
4 ">>>"榪愮畻絎︼紝鍙寵竟鐨勪綅琚鎸ゆ帀錛屽逛簬宸﹁竟縐誨嚭鐨勭┖浣嶄竴姒傝ˉ涓0銆
浣嶈繍綆楃︾殑搴旂敤 (婧愭搷浣滄暟s 鎺╃爜mask)
(1) 鎸変綅涓-- &
1 娓呴浂鐗瑰畾浣 (mask涓鐗瑰畾浣嶇疆0錛屽叾瀹冧綅涓1錛宻=s&mask)
2 鍙栨煇鏁頒腑鎸囧畾浣 (mask涓鐗瑰畾浣嶇疆1錛屽叾瀹冧綅涓0錛宻=s&mask)
(2) 鎸変綅鎴-- |
甯哥敤鏉ュ皢婧愭搷浣滄暟鏌愪簺浣嶇疆1錛屽叾瀹冧綅涓嶅彉銆 (mask涓鐗瑰畾浣嶇疆1錛屽叾瀹冧綅涓0 s=s|mask)
(3) 浣嶅紓鎴-- ^
1 浣跨壒瀹氫綅鐨勫煎彇鍙 (mask涓鐗瑰畾浣嶇疆1錛屽叾瀹冧綅涓0 s=s^mask)
2 涓嶅紩鍏ョ涓夊彉閲忥紝浜ゆ崲涓や釜鍙橀噺鐨勫 (璁 a=a1,b=b1)
鐩 鏍 鎿 浣 鎿嶄綔鍚庣姸鎬
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
浜岃繘鍒惰ˉ鐮佽繍綆楀叕寮忥細
-x = ~x + 1 = ~(x-1)
~x = -x-1
-(~x) = x+1
~(-x) = x-1
x+y = x - ~y - 1 = (x|y)+(x&y)
x-y = x + ~y + 1 = (x|~y)-(~x&y)
x^y = (x|y)-(x&y)
x|y = (x&~y)+y
x&y = (~x|y)-~x
x==y: ~(x-y|y-x)
x!=y: x-y|y-x
x< y: (x-y)^((x^y)&((x-y)^x))
x<=y: (x|~y)&((x^y)|~(y-x))
x< y: (~x&y)|((~x|y)&(x-y))//鏃犵﹀彿x,y姣旇緝
x<=y: (~x|y)&((x^y)|~(y-x))//鏃犵﹀彿x,y姣旇緝
搴旂敤涓句緥
(1) 鍒ゆ柇int鍨嬪彉閲廰鏄濂囨暟榪樻槸鍋舵暟
a&1 = 0 鍋舵暟
a&1 = 1 濂囨暟
(2) 鍙杋nt鍨嬪彉閲廰鐨勭琸浣 (k=0,1,2鈥︹sizeof(int))錛屽嵆a>>k&1
(3) 灝唅nt鍨嬪彉閲廰鐨勭琸浣嶆竻0錛屽嵆a=a&~(1<<k)
(4) 灝唅nt鍨嬪彉閲廰鐨勭琸浣嶇疆1錛 鍗砤=a|(1<<k)
(5) int鍨嬪彉閲忓驚鐜宸︾Щk嬈★紝鍗砤=a<<k|a>>16-k (璁緎izeof(int)=16)
(6) int鍨嬪彉閲廰寰鐜鍙崇Щk嬈★紝鍗砤=a>>k|a<<16-k (璁緎izeof(int)=16)
(7)鏁存暟鐨勫鉤鍧囧
瀵逛簬涓や釜鏁存暟x,y錛屽傛灉鐢 (x+y)/2 奼傚鉤鍧囧礆紝浼氫駭鐢熸孩鍑猴紝鍥犱負 x+y 鍙鑳戒細澶т簬INT_MAX錛屼絾鏄鎴戜滑鐭ラ亾瀹冧滑鐨勫鉤鍧囧兼槸鑲瀹氫笉浼氭孩鍑虹殑錛屾垜浠鐢ㄥ備笅綆楁硶錛
int average(int x, int y) //榪斿洖X,Y 鐨勫鉤鍧囧
{
return (x&y)+((x^y)>>1);
}
(8)鍒ゆ柇涓涓鏁存暟鏄涓嶆槸2鐨勫籙,瀵逛簬涓涓鏁 x >= 0錛屽垽鏂浠栨槸涓嶆槸2鐨勫籙
boolean power2(int x)
{
return ((x&(x-1))==0)&&(x!=0)錛
}
(9)涓嶇敤temp浜ゆ崲涓や釜鏁存暟
void swap(int x , int y)
{
x ^= y;
y ^= x;
x ^= y;
}
(10)璁$畻緇濆瑰
int abs( int x )
{
int y ;
y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
(11)鍙栨ā榪愮畻杞鍖栨垚浣嶈繍綆 (鍦ㄤ笉浜х敓婧㈠嚭鐨勬儏鍐典笅)
a % (2^n) 絳変環浜 a & (2^n - 1)
(12)涔樻硶榪愮畻杞鍖栨垚浣嶈繍綆 (鍦ㄤ笉浜х敓婧㈠嚭鐨勬儏鍐典笅)
a * (2^n) 絳変環浜 a<< n
(13)闄ゆ硶榪愮畻杞鍖栨垚浣嶈繍綆 (鍦ㄤ笉浜х敓婧㈠嚭鐨勬儏鍐典笅)
a / (2^n) 絳変環浜 a>> n
渚: 12/8 == 12>>3
(14) a % 2 絳変環浜 a & 1
(15) if (x == a) x= b;
銆銆 else x= a;
銆銆 絳変環浜 x= a ^ b ^ x;
(16) x 鐨 鐩稿弽鏁 琛ㄧず涓 (~x+1)

熱點內容
ios儲存密碼哪裡看 發布:2024-09-08 09:30:02 瀏覽:869
opensslcmake編譯 發布:2024-09-08 09:08:48 瀏覽:653
linux下ntp伺服器搭建 發布:2024-09-08 08:26:46 瀏覽:744
db2新建資料庫 發布:2024-09-08 08:10:19 瀏覽:173
頻率計源碼 發布:2024-09-08 07:40:26 瀏覽:780
奧迪a6哪個配置帶後排加熱 發布:2024-09-08 07:06:32 瀏覽:101
linux修改apache埠 發布:2024-09-08 07:05:49 瀏覽:209
有多少個不同的密碼子 發布:2024-09-08 07:00:46 瀏覽:566
linux搭建mysql伺服器配置 發布:2024-09-08 06:50:02 瀏覽:995
加上www不能訪問 發布:2024-09-08 06:39:52 瀏覽:811