當前位置:首頁 » 編程語言 » php位操作

php位操作

發布時間: 2023-05-28 08:59:48

『壹』 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 這個事怎麼算出來的

你這樣算

  1. -2的補碼 & -3的補碼 =(1111 1110)2 & (1111 1101 )2 =(1111 1100)2

  2. 減一取反得原碼 1111 1011 原碼1000 0100

  3. (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

熱點內容
內置存儲卡可以拆嗎 發布:2025-05-18 04:16:35 瀏覽:336
編譯原理課時設置 發布:2025-05-18 04:13:28 瀏覽:378
linux中進入ip地址伺服器 發布:2025-05-18 04:11:21 瀏覽:612
java用什麼軟體寫 發布:2025-05-18 03:56:19 瀏覽:32
linux配置vim編譯c 發布:2025-05-18 03:55:07 瀏覽:107
砸百鬼腳本 發布:2025-05-18 03:53:34 瀏覽:944
安卓手機如何拍視頻和蘋果一樣 發布:2025-05-18 03:40:47 瀏覽:741
為什麼安卓手機連不上蘋果7熱點 發布:2025-05-18 03:40:13 瀏覽:803
網卡訪問 發布:2025-05-18 03:35:04 瀏覽:511
接收和發送伺服器地址 發布:2025-05-18 03:33:48 瀏覽:372