电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP基礎之運算符4——位運算符

瀏覽:5日期:2022-09-14 14:39:37

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

位運算符例子名稱結果$a & $bAnd(按位與)將把?$a?和?$b?中都為 1 的位設為 1。$a | $bOr(按位同或)將把?$a?和?$b?中任何一個為 1 的位設為 1。$a ^ $bXor(按位異或)將把?$a?和?$b?中一個為 1 另一個為 0 的位設為 1。~ $aNot(按位取反)將?$a?中為 0 的位設為 1,反之亦然。$a << $bShift left(左移)將?$a?中的位向左移動?$b?次(每一次移動都表示“乘以 2”)。$a >> $bShift right(右移)將?$a?中的位向右移動?$b?次(每一次移動都表示“除以 2”)。

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

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

要注意數據類型的轉換。如果左右參數都是字符串,則位運算符將對字符的 ASCII 值進行操作。PHP 的 ini 設定 error_reporting 使用了按位的值,提供了關閉某個位的真實例子。要顯示除了提示級別之外的所有錯誤,php.ini 中是這樣用的:E_ALL & ~E_NOTICE

具體運作方式是先取得 E_ALL 的值:00000000000000000111011111111111再取得 E_NOTICE 的值:00000000000000000000000000001000然后通過 ~ 將其取反:11111111111111111111111111110111最后再用按位與 AND(&)得到兩個值中都設定了(為 1)的位:00000000000000000111011111110111

另外一個方法是用按位異或 XOR(^)來取得只在其中一個值中設定了的位:E_ALL ^ E_NOTICEerror_reporting 也可用來演示怎樣置位。只顯示錯誤和可恢復錯誤的方法是:E_ERROR | E_RECOVERABLE_ERROR

也就是將 E_ERROR00000000000000000000000000000001和 E_RECOVERABLE_ERROR00000000000000000001000000000000用按位或 OR(|)運算符來取得在任何一個值中被置位的結果:00000000000000000001000000000001

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

<?php/**?Ignore?the?top?section,*?it?is?just?formatting?to?make?output?clearer.*/$format?=?’(%1$2d?=?%1$04b)?=?(%2$2d?=?%2$04b)’.?’?%3$s?(%4$2d?=?%4$04b)’?.?'n';echo?<<<EOH---------?????---------??--?---------result????????value??????op?test---------?????---------??--?---------EOH;/**?Here?are?the?examples.*/$values?=?array(0,?1,?2,?4,?8);$test?=?1?+?4;echo?'n?Bitwise?AND?n';foreach?($values?as?$value)?{$result?=?$value?&?$test;printf($format,?$result,?$value,?’&’,?$test);}echo?'n?Bitwise?Inclusive?OR?n';foreach?($values?as?$value)?{$result?=?$value?|?$test;printf($format,?$result,?$value,?’|’,?$test);}echo?'n?Bitwise?Exclusive?OR?(XOR)?n';foreach?($values?as?$value)?{$result?=?$value?^?$test;printf($format,?$result,?$value,?’^’,?$test);}?>

以上例程會輸出:

--------- --------- -- --------- resultvalue 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 運算符

<?phpecho?12?^?9;?//?Outputs?’5’echo?'12'?^?'9';?//?Outputs?the?Backspace?character?(ascii?8)//?(’1’?(ascii?49))?^?(’9’?(ascii?57))?=?#8echo?'hallo'?^?'hello';?//?Outputs?the?ascii?values?#0?#4?#0?#0?#0//?’a’?^?’e’?=?#4echo?2?^?'3';?//?Outputs?1//?2?^?((int)'3')?==?1echo?'2'?^?3;?//?Outputs?1//?((int)'2')?^?3?==?1?>

Example #3 整數的位移

<?php/**?Here?are?the?examples.*/echo?'n---?BIT?SHIFT?RIGHT?ON?POSITIVE?INTEGERS?---n';$val?=?4;$places?=?1;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’copy?of?sign?bit?shifted?into?left?side’);$val?=?4;$places?=?2;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places);$val?=?4;$places?=?3;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’bits?shift?out?right?side’);$val?=?4;$places?=?4;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’same?result?as?above;?can?not?shift?beyond?0’);echo?'n---?BIT?SHIFT?RIGHT?ON?NEGATIVE?INTEGERS?---n';$val?=?-4;$places?=?1;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’copy?of?sign?bit?shifted?into?left?side’);$val?=?-4;$places?=?2;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’bits?shift?out?right?side’);$val?=?-4;$places?=?3;$res?=?$val?>>?$places;p($res,?$val,?’>>’,?$places,?’same?result?as?above;?can?not?shift?beyond?-1’);echo?'n---?BIT?SHIFT?LEFT?ON?POSITIVE?INTEGERS?---n';$val?=?4;$places?=?1;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places,?’zeros?fill?in?right?side’);$val?=?4;$places?=?(PHP_INT_SIZE?*?8)?-?4;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places);$val?=?4;$places?=?(PHP_INT_SIZE?*?8)?-?3;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places,?’sign?bits?get?shifted?out’);$val?=?4;$places?=?(PHP_INT_SIZE?*?8)?-?2;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places,?’bits?shift?out?left?side’);echo?'n---?BIT?SHIFT?LEFT?ON?NEGATIVE?INTEGERS?---n';$val?=?-4;$places?=?1;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places,?’zeros?fill?in?right?side’);$val?=?-4;$places?=?(PHP_INT_SIZE?*?8)?-?3;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places);$val?=?-4;$places?=?(PHP_INT_SIZE?*?8)?-?2;$res?=?$val?<<?$places;p($res,?$val,?’<<’,?$places,?’bits?shift?out?left?side,?including?sign?bit’);/**?Ignore?this?bottom?section,*?it?is?just?formatting?to?make?output?clearer.*/function?p($res,?$val,?$op,?$places,?$note?=?’’)?{$format?=?’%0’?.?(PHP_INT_SIZE?*?8)?.?'bn';printf('Expression:?%d?=?%d?%s?%dn',?$res,?$val,?$op,?$places);echo?'?Decimal:n';printf('??val=%dn',?$val);printf('??res=%dn',?$res);echo?'?Binary:n';printf(’??val=’?.?$format,?$val);printf(’??res=’?.?$format,?$res);if?($note)?{echo?'?NOTE:?$noten';}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 sideExpression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000001Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=00000000000000000000000000000100 res=00000000000000000000000000000000 NOTE: bits shift out right sideExpression: 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 sideExpression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=11111111111111111111111111111100 res=11111111111111111111111111111111 NOTE: bits shift out right sideExpression: -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 sideExpression: 1073741824 = 4 << 28 Decimal: val=4 res=1073741824 Binary: val=00000000000000000000000000000100 res=01000000000000000000000000000000Expression: -2147483648 = 4 << 29 Decimal: val=4 res=-2147483648 Binary: val=00000000000000000000000000000100 res=10000000000000000000000000000000 NOTE: sign bits get shifted outExpression: 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 sideExpression: -2147483648 = -4 << 29 Decimal: val=-4 res=-2147483648 Binary: val=11111111111111111111111111111100 res=10000000000000000000000000000000Expression: 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 sideExpression: 1 = 4 >> 2 Decimal: val=4 res=1 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000001Expression: 0 = 4 >> 3 Decimal: val=4 res=0 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0000000000000000000000000000000000000000000000000000000000000000 NOTE: bits shift out right sideExpression: 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 sideExpression: -1 = -4 >> 2 Decimal: val=-4 res=-1 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1111111111111111111111111111111111111111111111111111111111111111 NOTE: bits shift out right sideExpression: -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 sideExpression: 4611686018427387904 = 4 << 60 Decimal: val=4 res=4611686018427387904 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=0100000000000000000000000000000000000000000000000000000000000000Expression: -9223372036854775808 = 4 << 61 Decimal: val=4 res=-9223372036854775808 Binary: val=0000000000000000000000000000000000000000000000000000000000000100 res=1000000000000000000000000000000000000000000000000000000000000000 NOTE: sign bits get shifted outExpression: 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 sideExpression: -9223372036854775808 = -4 << 61 Decimal: val=-4 res=-9223372036854775808 Binary: val=1111111111111111111111111111111111111111111111111111111111111100 res=1000000000000000000000000000000000000000000000000000000000000000Expression: 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 的數值來進行位操作。

標簽: PHP
相關文章:
主站蜘蛛池模板: 周易算网-八字测算网 - 周易算网-宝宝起名取名测名字周易八字测算网 | 东亚液氮罐-液氮生物容器-乐山市东亚机电工贸有限公司 | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 博医通医疗器械互联网供应链服务平台_博医通 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 医学模型生产厂家-显微手术模拟训练器-仿真手术模拟训练系统-北京医教科技 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 机械加工_绞车配件_立式离心机_减速机-洛阳三永机械厂 | 泥浆在线密度计厂家-防爆数字压力表-膜盒-远传压力表厂家-江苏大亚自控设备有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | IHDW_TOSOKU_NEMICON_EHDW系列电子手轮,HC1系列电子手轮-上海莆林电子设备有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 建筑资质代办_工程施工资质办理_资质代办公司_北京众聚企服 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 无锡不干胶标签,卷筒标签,无锡瑞彩包装材料有限公司 | 超细|超微气流粉碎机|气流磨|气流分级机|粉体改性机|磨粉机|粉碎设备-山东埃尔派粉体科技 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 钢木实验台-全钢实验台-化验室通风柜-实验室装修厂家-杭州博扬实验设备 | 窖井盖锯圆机_锯圆机金刚石锯片-无锡茂达金刚石有限公司 | _网名词典_网名大全_qq网名_情侣网名_个性网名 | 山东活动策划|济南活动公司|济南公关活动策划-济南锐嘉广告有限公司 | 代理记账_免费注册公司_营业执照代办_资质代办-【乐财汇】 | LINK FASHION 童装·青少年装展 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 国际船舶网 - 船厂、船舶、造船、船舶设备、航运及海洋工程等相关行业综合信息平台 | 电子厂招聘_工厂招聘_普工招聘_小时工招聘信息平台-众立方招工网 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | 黄石东方妇产医院_黄石妇科医院哪家好_黄石无痛人流医院 | 模温机-油温机-电加热导热油炉-工业冷水机「欧诺智能」 | 水性漆|墙面漆|木器家具漆|水漆涂料_晨阳水漆官网 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 10吨无线拉力计-2吨拉力计价格-上海佳宜电子科技有限公司 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | pbootcms网站模板|织梦模板|网站源码|jquery建站特效-html5模板网 | 矿用履带式平板车|探水钻机|气动架柱式钻机|架柱式液压回转钻机|履带式钻机-启睿探水钻机厂家 | 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 |