当前位置:首页 » 编程语言 » 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)

热点内容
诺基亚密码忘了打什么电话 发布:2024-09-17 03:27:09 浏览:555
树深度优先算法 发布:2024-09-17 03:26:58 浏览:472
跳转页源码 发布:2024-09-17 03:13:05 浏览:543
html文件上传表单 发布:2024-09-17 03:08:02 浏览:785
聊天软件编程 发布:2024-09-17 03:00:07 浏览:726
linuxoracle安装路径 发布:2024-09-17 01:57:29 浏览:688
两个安卓手机照片怎么同步 发布:2024-09-17 01:51:53 浏览:207
cf编译后没有黑框跳出来 发布:2024-09-17 01:46:54 浏览:249
安卓怎么禁用应用读取列表 发布:2024-09-17 01:46:45 浏览:524
win10设密码在哪里 发布:2024-09-17 01:33:32 浏览:662