php位異或,php異或運算

本文目錄一覽:

php賦值運算中,$a=2;$a^=2;結果卻是0.這是為什麼?”^”如果是乘方的話,結果不應該是4么?

lz理解錯了。^在早期的BASIC語言和一些偽代碼中表示乘方

在PHP運算符中,^不是乘方,而是“位異或XOR”運算。

$a^=2是$a=$a^2的快捷形式。

異或運算遵循“同零異壹”的法則——數位上相同的二進制數字得0,數位上不同的數字得1.

比如1^1=0, 0^0=0, 1^0=1

(D)6^2=(B)110^10=(B)100=(D)4

(D)5^8=(B)101^1000=(B)1101=(D)13

(D)5^6=(B)101^110=(B)11=(D)3

PHP的浮點乘方用pow函數。

$a=pow(2,3);//2的3次方

$a=pow($a,$a);//$a的$a次方

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 位運算符的問題

這個涉及到系統底層,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位的,位移的結果就可能不一樣了,要將計算時位的數量調整下。

php中字符變量 異或 ‘1’^’2′ 的值

?php

  echo (1^2).”\n”;

  echo (‘123’^’ACE’).”\n”;

?

你猜猜這個執行結果是什麼?

在PHP裡面,整數進行位運算的結果和C語言是相同的,這個你明白,我不多說。但是PHP的位運算更高級,如果左右參數都是字符串,則位運算符將操作字符的    ASCII 值。

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

原創文章,作者:WMATX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/329716.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WMATX的頭像WMATX
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種數據庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論