當前位置:首頁 » 編程語言 » php補碼

php補碼

發布時間: 2022-08-28 03:57:08

php中echo 12 ^ 9;得出的結果是什麼誰能給我個完美的解釋。PHP新手這邊有禮了~~0.0

對,這是"^" 按位異或運算
按位異或運算符「^」是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1,反之結果為0;
使用sprintf 列印出 12 和 9 的二進制。結果為
1100和1001
--------------------------
運算過程 :從左到右
第一位都是1 那麼得 0
第二位相異 得 1
第三位都是0 得 0
第四位相異 得 1
那麼結果就是0101
轉化為十進制~就是5了。

⑵ PHP 按位取反 運算符(~) 到底怎麼算出來的 $a = 8 $b = ~$a echo $b 結果是 - 9

在數值范圍內,~a = -(a+1)

8的二進制是1000,補滿32位,也就是前面28個0 1000
取反後 28個1 0111
第一位是符號位 1代表負數,剩下的27個1 0111
負數是用補碼表示的,補碼是原碼取反+1,也就是說 27個1 0111 是某個數的補碼,那倒推回去,這個數就是補碼-1後取反,也就是 27個1 0110取反,得到27個0 1001,也就是9,再加上前面的符號位,得到-9

⑶ 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中的位邏輯運算符的問題,求高手詳細解答...

是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為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 位運算】 -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中echo intval((0.1+0.7)*10) 結果為7而不是8

如果你仔細看過在PHP手冊中,對於浮點數據類型的說明,就會看到其中有專門的一個警告提示,就談到這個問題:

關於浮點數精度的警告

顯然簡單的十進制分數如同 0.1 或 0.7不能在不丟失一點點精度的情況下轉換為內部二進制的格式。這就會造成混亂的結果:

例如,floor((0.1+0.7)*10)通常會返回 7 而不是預期中的 8,因為該結果內部的表示其實是類似 7.9。

這和一個事實有關,那就是不可能精確的用有限位數表達某些十進制分數。例如,十進制的 1/3 變成了 0.3。

所以永遠不要相信浮點數結果精確到了最後一位,也永遠不要比較兩個浮點數是否相等。如果確實需要更高的精度,應該使用任意精度數學函數或者 gmp 函數。

實際上,並不是php會有這種現象,對於其他計算機語言,類似的浮點數問題也是差不多的。

⑺ PHP 負數值得問題

在計算機中,負數以其正值的補碼形式表達。
什麼叫補碼呢?這得從原碼,反碼說起。

原碼:一個整數,按照絕對值大小轉換成的二進制數,稱為原碼。
比如 00000000 00000000 00000000 00000101 是 5的 原碼。

反碼:將二進制數按位取反,所得的新二進制數稱為原二進制數的反碼。
取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)
比如:將00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。
稱:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反碼。
反碼是相互的,所以也可稱:
11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互為反碼。

補碼:反碼加1稱為補碼。
也就是說,要得到一個數的補碼,先得到反碼,然後將反碼加上1,所得數稱為補碼。
比如:00000000 00000000 00000000 00000101 的反碼是:11111111 11111111 11111111 11111010。
那麼,補碼為:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在計算機中表達為:11111111 11111111 11111111 11111011

⑻ 請問php中$c=(-3)^3; echo $c;會輸出多少為什麼

php中$c=(-3)^3;
echo
$c;輸出-2.
因為^在php中是異或運算符,也就是說在二進制中1^1=0,0^0=0,1^0=1,0^1=1
我們用一個位元組(即八位二進制數)為例:
3表示為二進制數是00000011
3的二進制反碼是11111100
3的二進制補碼是11111101(是3二進制數00000011的反碼加1)
-3表示為二進制數是11111101(是3二進制數00000011的補碼)
-3^3表示為二進制數的計算方法是:
00000011
(3)
11111101
(-3)
=11111110
(-2)
所以php中$c=(-3)^3;
echo
$c;輸出-2.

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

並不是4位二進制數取反
取反操作,兩個值之和為-1
作為有符號整數,8至少要用8個二進制位表示
00001000,按位取反結果11110111,這個數是有符號整數,則為一個負數的補碼,即-9
當你不知道怎麼算的時候,就記住一個數與它按位取反結果之和為-1就行了

熱點內容
詐騙的腳本 發布:2025-01-16 23:51:27 瀏覽:314
電腦配置有點低怎麼玩和平精英 發布:2025-01-16 23:46:14 瀏覽:818
ipfs分布式伺服器是什麼幣種 發布:2025-01-16 23:32:29 瀏覽:991
android動態icon 發布:2025-01-16 23:03:12 瀏覽:605
優酷電腦緩存在哪 發布:2025-01-16 22:58:29 瀏覽:298
進口途銳哪個配置好 發布:2025-01-16 22:35:24 瀏覽:962
骨幹路由器怎麼配置 發布:2025-01-16 22:24:39 瀏覽:244
途安2021款買哪個配置 發布:2025-01-16 22:21:01 瀏覽:329
圖片的壓縮原理 發布:2025-01-16 22:17:15 瀏覽:493
雲伺服器本地電腦 發布:2025-01-16 22:17:04 瀏覽:961