首頁 > 後端開發 > php教程 > PHP位元運算符

PHP位元運算符

WBOY
發布: 2016-07-30 13:30:44
原創
1269 人瀏覽過

位元運算子允許對整數數中指定的位元進行求值和操作。

將把 $a將把 $aXor(位元異或)Not(按位取反)將 $a Shift left(左移)將 $a >> $b將 $a 中的位元向右移動至每一次移2$b ”)。
位運算子
名稱 結果
和 $b 中都為1 的位元設為1。 $a | $bOr(按位或)
 和$1將把 $a 和$1 $a ^ $b
將把 $a ~ $a
$a 中為 0 的位元設為 11,反之亦然。
$a 中的位元向左移動一次中的位元”)。 Shift right(右移)

位移在 PHP 中是數學運算。向任何方向移出去的位元都被丟棄。左移時右側以零填充,符號位元移走表示正負號不被保留。右移時左側以符號位填充,表示正負號保留。

要用括號確保想要的優先權。例如 $a & $b == true 先進行比較再進行位元與;而 ($a & $b) == true 則先進行位元與再進行比較。

要注意資料型別的轉換。如果左右參數都是字串,則位元運算子將對字元的 ASCII 值進行操作。

PHP 的 ini 设定 error_reporting 使用了按位的值,
提供了关闭某个位的真实例子。要显示除了提示级别
之外的所有错误,php.ini 中是这样用的:
<span><codefira mono code pro word-wrap:break-word>E_ALL & ~E_NOTICE</codefira></span>
登入後複製
具体运作方式是先取得 E_ALL 的值:
<span>00000000000000000111011111111111</span>
再取得 E_NOTICE 的值:
<span>00000000000000000000000000001000</span>
然后通过 <span>~</span> 将其取反:
<span>11111111111111111111111111110111</span>
最后再用按位与 AND(&)得到两个值中都设定了(为 1)的位:
<span>00000000000000000111011111110111</span>
登入後複製
另外一个方法是用按位异或 XOR(<span>^</span>)来取得只在
其中一个值中设定了的位:
<span><codefira mono code pro word-wrap:break-word>E_ALL ^ E_NOTICE</codefira></span>
登入後複製

error_reporting 也可用来演示怎样置位。只显示错误和可恢复
错误的方法是:
<span><codefira mono code pro word-wrap:break-word>E_ERROR | E_RECOVERABLE_ERROR</codefira></span>
登入後複製
也就是将 E_ERROR
<span>00000000000000000000000000000001</span>
和 E_RECOVERABLE_ERROR
<span>00000000000000000001000000000000</span>
用按位或 OR(<span>|</span>)运算符来取得在任何一个值中被置位的结果:
<span>00000000000000000001000000000001</span>
登入後複製

Example #1 整數的AND,OR 和XOR 位元運算子

? the top section,

 * it is just formatting to make output clearer. */
$format 


'(%1$2d  %1$04b)

'(%1$2d  %1$04b)   
' %3$s (%4$2d = %4$04b)' 
"n";echo ;echo -----  -- --------- result        value      op test ---------     --------- -

EOH;

/*
 * Here are the examples.
 */



2
48);$test  Bitwise AND n";foreach ( $values as 
$value) {    $result      printf
(
$format
$result$value
'&'
$test); ";foreach ( $values as 
$value) {    $result      printf($format $result$value

'|'
$test
cive); (XOR) n";foreach ($values as 
$value) {    $result ;    printf
(
$format $result$value'^'); 以上例程會輸出:

 ---------     ---------  -- ---------
 result        value      op test
 ---------     ---------  -- ---------
 Bitwise AND
( 0 = 0000) = ( 0 = 0000) & ( 5 = 0101)
( 1 = 0001) = ( 1 = 0001) & ( 5 = 0101)
( 0 = 0000) = ( 2 = 0010) & ( 5 = 0101)
( 4 = 0100) = ( 4 = 0100) & ( 5 = 0101)
( 0 = 0000) = ( 8 = 1000) & ( 5 = 0101)

 Bitwise Inclusive OR
( 5 = 0101) = ( 0 = 0000) | ( 5 = 0101)
( 5 = 0101) = ( 1 = 0001) | ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) | ( 5 = 0101)
( 5 = 0101) = ( 4 = 0100) | ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) | ( 5 = 0101)

 Bitwise Exclusive OR (XOR)
( 5 = 0101) = ( 0 = 0000) ^ ( 5 = 0101)
( 4 = 0100) = ( 1 = 0001) ^ ( 5 = 0101)
( 7 = 0111) = ( 2 = 0010) ^ ( 5 = 0101)
( 1 = 0001) = ( 4 = 0100) ^ ( 5 = 0101)
(13 = 1101) = ( 8 = 1000) ^ ( 5 = 0101)
登入後複製

Example #2 字串的XOR 運算子

echo 12 955; "12" 
"9" // 輸出退格字元(ascii 8)                 // echo "hallo" 

「你好」; // 產出ascii 值 #0 #4 #0 #0 #0     ^ 'e' = #4echo 
^
「3」; // 輸出 1              //  3

//輸出1
//((int)「 2」)^3 ==1

/*
 * 以下是範例。
 */
echo "n--- 正整數上右移位 ---n";
= 1;
$res 
$val >> 
$val, '>>'$地點
'複製符號位移到左邊');$val $位置 2; $res  $val > $res
$val '>>'
$地點); $val 
=
3; $res $val 
>;
'>>'$地點'位移出右邊');$val 4 ;
$res $val  >> 
$地點;p. '>>'
, $地點一樣結果如上;無法移位超過0');echo "n--- 負整數位右移---n"
"n--- 負整數位右移---n"; = -4 ;$地點 1; >> $地點;
p($res
$val
'>>'
$val
= -4;$位置
2
; >>> $地點 ;p($res$val'>>'$
);
$val = -
4;$地點
3$m >> $地點 ;
p($res$val
' 1 '
);echo "n--- 正整數左移位---n";$val 1;$res $val 
p($res$val') ; $val 4;
$地點 = (* 4;
$res  $val $地點;p
(
$res, $地點) ; $val 
4;$地點 = ( 3; $資源$ val
$地點;p
( '$地點'標誌位被移出');$val
4_PH🜳 8
) - 
2 ;$res $val  $res
$val',
$地點'位元向左移出');echo 
;
$val = -4;  
$val 
$地點;p(
$res
$val'零填入右側' );$val = -4;$地方 INT= (
$地方 
INT= ( ) - 
3
;$ res 
$val 
$地點;
', $地點); $val 
= -
4; 8) - 2 ; $res  $val 
$地點
val'
$地點'位向左移出,包括符號位');/*);/** 。
*/
函數p( $res
$o
 $注意  '') {     $格式= '%0' 。 (PHP_INT_SIZE 
8)。 「bn」
;
    
printf("Expression: %d = %d %s %d\n"$res$val$op$places);
    echo 
" Decimal:\n";
    
printf("  val=%d\n"$val);
    
printf("  res=%d\n"$res);
    echo 
" Binary:\n";
    
printf('  val=' $format$val);
    
printf('  res=' $format$res);
    if (
$note) {
        echo 
" NOTE: $note\n";
    }
    echo 
"\n";
}
?>

以上例程在 32 位机器上的输出:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
  val=4
  res=2
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2
 Decimal:
  val=4
  res=1
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000001

Expression: 0 = 4 >> 3
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 >> 4
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
  val=4
  res=8
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 1073741824 = 4 << 28
 Decimal:
  val=4
  res=1073741824
 Binary:
  val=00000000000000000000000000000100
  res=01000000000000000000000000000000

Expression: -2147483648 = 4 << 29
 Decimal:
  val=4
  res=-2147483648
 Binary:
  val=00000000000000000000000000000100
  res=10000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 << 30
 Decimal:
  val=4
  res=0
 Binary:
  val=00000000000000000000000000000100
  res=00000000000000000000000000000000
 NOTE: bits shift out left side


--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
  val=-4
  res=-8
 Binary:
  val=11111111111111111111111111111100
  res=11111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -2147483648 = -4 << 29
 Decimal:
  val=-4
  res=-2147483648
 Binary:
  val=11111111111111111111111111111100
  res=10000000000000000000000000000000

Expression: 0 = -4 << 30
 Decimal:
  val=-4
  res=0
 Binary:
  val=11111111111111111111111111111100
  res=00000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit
登入後複製

以上例程在 64 位机器上的输出:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---
Expression: 2 = 4 >> 1
 Decimal:
  val=4
  res=2
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000010
 NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2
 Decimal:
  val=4
  res=1
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000001

Expression: 0 = 4 >> 3
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out right side

Expression: 0 = 4 >> 4
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: same result as above; can not shift beyond 0


--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---
Expression: -2 = -4 >> 1
 Decimal:
  val=-4
  res=-2
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111110
 NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: bits shift out right side

Expression: -1 = -4 >> 3
 Decimal:
  val=-4
  res=-1
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111111
 NOTE: same result as above; can not shift beyond -1


--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---
Expression: 8 = 4 << 1
 Decimal:
  val=4
  res=8
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000001000
 NOTE: zeros fill in right side

Expression: 4611686018427387904 = 4 << 60
 Decimal:
  val=4
  res=4611686018427387904
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0100000000000000000000000000000000000000000000000000000000000000

Expression: -9223372036854775808 = 4 << 61
 Decimal:
  val=4
  res=-9223372036854775808
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=1000000000000000000000000000000000000000000000000000000000000000
 NOTE: sign bits get shifted out

Expression: 0 = 4 << 62
 Decimal:
  val=4
  res=0
 Binary:
  val=0000000000000000000000000000000000000000000000000000000000000100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side


--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---
Expression: -8 = -4 << 1
 Decimal:
  val=-4
  res=-8
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1111111111111111111111111111111111111111111111111111111111111000
 NOTE: zeros fill in right side

Expression: -9223372036854775808 = -4 << 61
 Decimal:
  val=-4
  res=-9223372036854775808
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=1000000000000000000000000000000000000000000000000000000000000000

Expression: 0 = -4 << 62
 Decimal:
  val=-4
  res=0
 Binary:
  val=1111111111111111111111111111111111111111111111111111111111111100
  res=0000000000000000000000000000000000000000000000000000000000000000
 NOTE: bits shift out left side, including sign bit
登入後複製

Warning

不要在 32 位系统下向右移超过 32 位。不要在结果可能超过 32 的情况下左移。使用 gmp 扩展对超出 PHP_INT_MAX 的数值来进行位操作。

参见 pack()unpack()gmp_and()gmp_or()gmp_xor()gmp_testbit() 和 gmp_clrbit()

add a note add a note

User Contributed Notes 43 notes

up

down

46wbcarts at juno dot com ?
3 years ago

自訂位元標誌 PHP 物件
有時我需要一個自訂 PHP 物件來保存多個布林 TRUE 或 FALSE 值。我可以輕鬆地為每個變量添加一個變量,但像往常一樣,程式碼很快就會變得笨拙。更聰明的方法似乎總是答案,即使 如果一開始看起來有點過分的話。
我從一個抽象基底類別開始,它將保存一個名為 $flags 的整數變數。這個簡單的整數可以容納 32 個 TRUE 或 FALSE 布林值。另一個需要考慮的是只設定某些 BIT 值而不干擾任何其他 BITS -- 因此,在類別定義中包含 setFlag($flag, $value) 函數,該函數將僅設定所選位元。這是抽象基底定義: 
# BitwiseFlag.php
抽象類 BitwiseFlag
/*
   * 註:這些函數受到保護,以防止外部程式碼
   * 錯誤地設定BITS。看看擴充類別 'User'   * 如何處理這個問題。    *   */
  
受保護的函數

isFlagSet

(

$flag
;標誌$標誌) == 
$flag
);  }  受保護函數setFlag($flag)$ $價值)    {

$這個
->flags |=$flag; $這個
->;
旗幟&= ~
$flag
;    }  }}?>上面的類別是抽象的,無法實例化,所以需要擴充。下面是一個名為 User 的簡單擴充 - 為了清晰起見,它被嚴重截斷。請注意,我正在定義 const 變數和方法來使用它們。

# User.php
require('BitwiseFlag.php'); {  const FLAG_REGISTERED 


1

// $flags 的 BIT #1 的值為 1
  

const 
FLAG_ACTIVE 

2;     // $flags 的 BIT #2 的值是 2  
const FLAG_MEMBER     // $flags 的 BIT #3 的值是 4
  
const 
FLAG_ADMIN = // $flags 的第4 位的值是8  公用函數isRegistered
(){
    自我: : FLAG_REGISTERED);  }  公用函數 
isActive
(){    return 自我::FLAG_ACTIVE
);
  }  公用函數 isMember(){   isMember(){   isMember
$this::-> AG_ME MBER);  }
  公用函數
isAdmin(){    return $this->isFlagSet(_o);   公用函數 
setRegistered
( $值
){
    $這個->setFlag(self_of::(

);
  }
  公用函數 
setActive($value){
    
::$this  FLAG_ACTIVE$值? 自我::FLAG_MEMBER $value);
  }
 
)$);  }     $this
-> setFlag (自己 ::FLAG_ADMIN$value);    return '使用者[' 
.
(
$這個-> ;已註冊() ? 
'已註冊' '') .      ($這個->isActive() ? '活動' 

''
) .      (
$這個
->是會員
() ? '會員' '') .      ($這個->isAdmin
() ? '管理員' '') .    ']';  }}
? >這看起來工作量很大,但我們解決了很多問題,例如,使用和維護程式碼很容易,以及標誌值的取得和設定是有意義的。透過 User 類,您現在可以看到按位標誌操作是多麼簡單和直觀 變成 setRegistered();
$user->$user-> $user ->設定會員
(
);

$user
->Ad echo 

$user
;  
// 輸出:使用者[註冊活躍會員管理員]? >

6zlell grxnslxves13 在 hotmail dot com~=s/x/ee/g ? 9年前

我指的是埃里克·斯旺森的 關於 Perl VS PHP 的異或實現的帖子。 
實際上,這不是 XOR 實現的問題,而是與 PHP 採用的遺失輸入策略有關。 
在 int 和 float 之間自由切換在大多數情況下都很好,但是當你的值接近機器的字大小時就會出現問題。也就是說,32 位元機器會遇到值徘徊在 0x80000000 附近的問題 - 主要是因為 PHP 不支援無符號整數。
使用bindec/decbin可以解決這個問題,作為執行無符號整數異或的解決方法,但這是真實的情況(我並不是說這段程式碼會表現得更好,但這將是一個更好的教學代碼):
function unsigned_xor32 ($a $a1 
$a 
0x7FFF0000;        $a2 $a 
$a 0   $a3 
$a 0x80000000 $b1 $b 
0x7FFF0000;     $ 0x0000FFFF;        $b3 
= $ b 0x80000000;        $c 
) ? 
0x80000000 0;         |($a2 
$b2)) + $c;}$x 3851235679 ;
迴音 
"
這是我們想要的值"
;echo "
3851262585";echo "
對整數運算echo 
"
"
。 ($x 

$y
);echo "
因此我們單獨執行MSB" 32
(
$x$y);
?>
這真的是粉底東西,但對於那些在大學裡錯過這個的人,這裡似乎有一些關於粉底2 補碼的東西:
http://www.evergreen.edu/biophysicals/technotes/program/2s_comp.htm
up
downup 在 ich 點網 ? 2 年前
我重新實現了按位 NOT (~)
    受保護函數FlipBin($number) {
        $bin = str_pad(base_convert($number, 10, 2), 32, 0, STR_PAD_LEFTFT); $i++) {            switch ($bin{$i}) {              case '0' :                break;             案例'1' :            '0';                    break;            }      大於MAX_INT 的數字

3維維卡南德 gmail dot com 的 dot pathak25  ?
2 年前

$a =     9;
$b =     10;
回復    1
$a                    0      0    0     0  0 0   1   =9
$b                     0      0   0    
他們唯一共享的位元是8 位元。因此返回 8。
  $a =     36;
$b =     103;
echo $a & $b;
位置值   128                  0     0    1     0    0    1   0   0   1    1 0    0    1   1   1   =103
結果  32+4 = 36
這兩個共享的唯一位元是位32 且4,加在一起時返回36。
$a =    9;
$b = 10;
回顯$a | $b;
位元值   128  64  32  16      0      0    0     0    1  0   0   1   =9
$ 0     0    1   0  1   0   =10
結果8+2+1 = 11
在第8、2 與1 欄位中設定了3 個位元。將它們相加8+2+1,得到11
$a =     9;
$b =     10;
echo $a ^ $b;
位置值   128 64  32 ^ $b;
位置值   128 64  32 ^ $b;
位置值                   0      0    0     0 1  0   0   1   =9
$b                     0     0   0    2+1 = 3
它們的第2 位和第1 位每個人都設定了但不共享。蘇2+1 = 3




向上向下

3

豐富 在seachawaii dot com
 ? 2年前
只是關於負面的註釋 移位值,如文件所述,每個移位都是整數乘或除(分別向左或向右)2。這意味著負移位值(右側操作數)會影響移位的符號,而不是移位的方向,如下所示我會 已經預料到了。  FE。 0xff>> -2 結果為 0x0 

和 0xff

w3theophilus 在 gmail dot com

 ?

6年前

對於那些正在尋找的人 對於PHP 中處理負值的循環位移函數(對於加密函數特別有用),這是我編寫的一個小函數:
(注意:我花了幾乎一整天的時間才讓它處理負$num 值(我不明白為什麼它有時有效,有時無效),因為PHP 只有算術運算,而不是像我習慣的那樣的邏輯按位右移,即0x80000001>>16 。 將輸出(二進位)“1111 1111 1111 1111 1000 0000 0000 0000”,而不是您期望的“0000 0000 0000 0000 1000 0000 000 0000000”。要解決此問題,您必須套用等於 0x7FFFFFFF 的遮罩(位元 &),右移比您的偏移量少一 正在移動。 )
函數circular_shift$num$offset) { //進行無損循環按位移位,若偏移正向左移,若負向右移
    
$num=(int)$num h=(int)
$num = 0x7ffffffff//面膜 迎合 PHP 只做算術右移而不邏輯運算的事實,即 PHP 在右移負值時不會給出預期輸出    
if ($offset>0$offset>
0 {        $num=($num
$偏移%32) | (($num>>(32-$偏移量%32)) & ($面膜>>(31-$offset%32 
0
){        $偏移量=
abs
($num>>$偏移量%
32
) & ($面膜>>(-1+$偏移量%32)))) |($num&lt;&lt;(32-$offset324 } ? >
3
m0sh 在 hotmail dot com
 ?
7年前

@greenone - 不錯的功能, 謝謝。我將其改編為金鑰用法:
function bitxor($str,$ {    $xorWidth 
PHP_INT_SIZE*8 o1 str_split(
$str
$xorWidth);    $o2 =_str_split( ($str
), $ key), $xorWidth);    $res ''? 計數($o1);     for($i=0
;
$i$;
$i
 $res .= decbin(
bindec($o1[$i]) ^ bindec($o2[
$i
]));       回傳$res;}? 斯旺森9 年前Perl 與 PHP 實現 ^ 運算子的說明:在嘗試將 Perl 模組轉換為 PHP 後,我意識到 Perl 的 ^ 運算子的實作與 PHP 的實作不同。  預設情況下,Perl 將變數視為浮點數,而 PHP 將變數視為整數。  我能夠驗證 PHP 的使用 運算子透過聲明「使用整數;」在 Perl 模組中,它輸出與 PHP 使用的結果完全相同的結果。 邏輯決定是在 PHP 中使用 ^ 運算子時將每個變數強制轉換為(浮點型)。  然而,這不會產生相同的結果。  經過大約半小時的頭撞牆後,我發現了一個寶石並使用以下函數編寫了一個函數 PHP 中的二進位到十進制轉換。 /*沒有太多按位運算的經驗,我不能告訴你這是最好的解決方案,但它肯定是一個最終有效的解決方案,並且總是返回與 Perl 提供的完全相同的結果。 */function binxor($a, $b) {    return bindec(decbin((float)$a ^ (float)$b));}//普通PHP 程式碼不會產生與Perl 相同的結果 $結果= 3851235679 ^ 43814; //= -443704711//得到與Perl 相同的結果
$result = binxor(3851235679, 43814); //625851 ,請嘗試以下操作
$a = 3851235679 XOR 43814;$b = 3851235679 ^ 43814; //整數結果$c = (float)3851235679 ^float = 4$d 3851235679, 43814); 相同//與Perl相同! ! echo("A: $a
");
echo("B: $b
");
echo("C: $c
");
echo("D : $d
");

向上

向下

10

grayda 點 NOSPAM 位於 DONTSPAM 點 Solidinc 點組織 ? 6年前

最初,我發現了位元掩碼 這是一個令人困惑的概念,並且發現它沒有任何用處。所以我寫了這個程式碼片段,以防其他人感到困惑:
    //車輛可以擁有的各種細部
    
$hasFourWheels 1🜎
1🜵; = 2;
    
$hasDoors     4;
    
$hasRedColour  8
$hasTwoWheels;    $高爾夫球越野車     
$FourWheels$FourWheels ;    
$福特           $hasFourWheels      $hasFourWheels
$hasDoors $hasDoors $RedhasDoors $RedhasDoors 
$RedhasDoors 
$RedhasDoors $RedhasDoors $5紅紅 ;
    
$isBike        $hasFourWheels $hasFourWheels $hasFourWheels 
錯誤,因為 $bike 沒有四個輪子
    $isGolfBuggy   $hasFourWheels $hasFourWheeluggy$ 是的,因為 $golfBuggy 有四個輪子    $isFord        

$hasFourWheels 


$hasFourWheels5%; 是的,因為 $ford $有FourWheels
? >
你可以將其應用到很多事情上,例如安全性:    //安全權限:    
$ writePost 1 2;
    
$deletePost 4 ;
    
$addUser 8 ;
    
    //使用者群組:    $管理員 

$ writePost 
$readPosts $刪除貼文ete $版主$readPost  $deletePost $deleteUser
;    $作家=     $guest $readPost;     
//檢查權限的函數    function checkPermission (發 {        if(
$使用者 
$權限) {            return 
;
        } else {
     }    }     // 現在我們應用所有這些!     if(checkPermission( $管理員
$刪除使用者) {        刪除使用者
("一些 User"
); 
# 執行此操作是因為 $administrator 可以 $deleteUser    }
? >

一旦你掌握了它,它就非常有用!請記住將每個值提高 2 的冪以避免出現問題

向上

向下

6ivoras 在 gmail dot com  ?
4年前

作為一個額外的好奇心, 由於某種原因,運算結果(“18”和“32”)是“10”。換句話說,嘗試避免在字符串上使用二元運算符:)

up

down

10
10年前

實用的位元運算符 case :
    // 我們想知道該顏色的紅色、綠色、藍色值:
    
$color $red = $顏色
>> 16 ;    $綠色 = ($005
>>> 
;    $藍色 $顏色 printf( '紅色 :%X (%d)、綠色:%X (%d)、藍色:%X (%d)'
      紅色$紅色、 $$紅色、 
$
$紅$綠色
$藍色$藍色) ;    // 將顯示...    // 紅色:FE (254),綠色:A9 (169),藍色:46 (70)?>up
下來
4

zooly 在 globmi dot com
 ?

5年前

這是一個按位的例子 leftrotate 和 rightrotate。

請注意,此函數僅適用於十進制數字 - 其他類型可以使用 pack() 進行轉換。

function rotate 
($decimal

$decimal


$位
) {  $二進位 decbin($十進位🎠);
substr
( $二進位$位).substr

(
$binary0) $bits0); 1 24 (1111100) 向左1位元echo 旋轉(1241);/1101011/10311211213112131/112121/112121/1321211) 00) 往右加3 位

迴聲
旋轉
(
124, -3);// = 79 (1001111)?>


喬什 在 joshstrike dot com  ? 4年前

更多參考此 我自己比任何東西都重要...如果您需要迭代每個可能的二進位組合,其中$n 個標誌在$bits 長度的遮罩中設定為1:
masksOf
echo 
masksOfecho masksOf ( 310
); 函數masksOf($ /開始 值,滿旗。     
$masks 
= array();    同時($u>$u>        $z numflags
($u);
$narray_push(
$ masks
,$u);         $u--; ; 
函數numflags($n ) {     $k 0    while (
+= $n 

1        

$n 
$n >>> 1
;     ); //    交替: //    $u = 0;  //    for ($k=1;$k//        $u+=($n&$k?1:0); 
//    } // u); 

? >

4
伊斯賓塞 例如.com ? 3 年前

NOT 或補運算符 ( ~ ) 和負二進制數可能會令人困惑。
~2 = -3 ,因為您使用公式 ~x = -x - 1  十進制數的按位補碼是該數減 1 的負數。 注意:只需使用下面的範例中使用 4 位,但實際上 PHP 使用 32 位。 將負十進位數(即:-3)轉換為二進位需要3 個步驟:1)將十進位數的正數轉換為二進位(即:3) = 0011)
2) 翻轉位元(即:0011 變成1100)
3)加上1(即:1100 + 0001 = 1101)您可能想知道1101 = -3 是怎麼來的。 PHP 使用「2 的補碼」方法來呈現負二進位數。如果最左邊的位子是 1,那麼二進制數就是負數,你可以翻轉這些位並加 1。如果它是 0,那麼它就是正數,你不需要 必須做任何事。所以 0010 是正數 2。如果是 1101,則是負數,翻轉位即可得到 0010。加 1 就得到 0011,等於 -3。






4

6 你們

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板