一、逻辑运算符

正式说位运算符之前,先简单提一下逻辑运算符。分3个角度:

0、数学上

记得高中数学讨论复合命题的时候,使用过基本的逻辑运算符

“非”(¬)、”与”(∧)、”或”(∨)、”条件”(→)以及”双条件”(↔)

大学离散数学中讨论复合命题的时候,出现过异或逻辑符

p ⊕ qp 异或 q p、q 真值相同为假,相异为真

1、集成电路

继承电路的逻辑门中出现过异或,讨论的是高低电平。

A ⊕ B 只有其中一个输入为高时,输出为高;否则为低。

2、计算机世界

以PHP语言为例, 逻辑运算符如下:

$a && $bAnd(逻辑与)TRUE,如果 $a 和 $b 都为 TRUE。

$a || $bOr(逻辑或)TRUE,如果 $a 或 $b 任一为 TRUE。

$a xor $bXor(逻辑异或)TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。

! $a Not(逻辑非)TRUE,如果 $a 不为 TRUE。

因为运算符优先级不同,逻辑与和逻辑或还有下面两种写法

$a and $bAnd(逻辑与)TRUE,如果 $a 和 $b 都为 TRUE。

$a or $bOr(逻辑或)TRUE,如果 $a 或 $b 任一为 TRUE。

注意:这里有一个逻辑异或。

二、位运算符

位运算符是计算机系统中对二进制整数的操作符号。

0、以PHP语言为例,位运算符如下:

$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”)。

异或支持整数和字符串的操作,按位与、按位或只支持整数。其他待验证。

1、两个整数的异或

把两个数的二进制位按位异或,输出结果。

php -r "var_dump(1 ^ 2);"

int(3)

2、两个字符串的异或

按每个字符的ASCII来异或,输出对于ASCII码对于的字符,字符可能不可见,所以直接打印输出结果可能是空字符串,这里通过ord转换。

单个字符

php -r "var_dump('a' ^ 'b', ord('a' ^ 'b'));"

string(1) ""

int(3)

字符串

$result = "hallo" ^ "hello";

var_dump($result);

for($i = 0; $i < strlen($result); $i++) {

echo ord($result[$i]), PHP_EOL;

}

以上输出

php test_code/bit.php

string(5) ""

0

4

0

0

0

3、按位与

整数支持

php -r 'var_dump(3 & 5);'

int(1)

字符串不支持

php -r 'var_dump(3 & "a");'

PHP Warning: A non-numeric value encountered in Command line code on line 1

Warning: A non-numeric value encountered in Command line code on line 1

int(0)

4、按位或

整数支持

php -r 'var_dump(5 | 3);'

int(7)

字符串不支持

php -r 'var_dump(5 | "a");'

PHP Warning: A non-numeric value encountered in Command line code on line 1

Warning: A non-numeric value encountered in Command line code on line 1

int(5)

三、位运算符应用

0、debug的时候在index.php中加入的以下语句你一定不陌生。

打印除了Notice和Strict外的所以异常。

ini_set('display_errors', 'on');

error_reporting(E_ALL & ~E_STRICT & ~E_NOTICE);

这里E_ALL都是常量,使用对于的整数进行按位运算。

1、不用+ -实现两数相加

class Solution {

/**

* @param Integer $a

* @param Integer $b

* @return Integer

*/

function getSum($a, $b) {

while ($b != 0) {

$carray = ($a & $b) << 1;

$a = $a ^ $b;

$b = $carray;

}

return $a;

}

}

2、不用额外的存储空间,实现两数交换

$a = "abc";

$b = "def";

$a = $a ^ $b;

$b = $a ^ $b;

$a = $a ^ $b;

var_dump($a, $b);

以上输出

php test_code/bit.php

string(3) "def"

string(3) "abc"

说明:

一个数异或本身结果是0,

php -r 'echo "0" ^ "a" ^ "a" ^ 4;'

4

看上面3个赋值语句

// 初始赋值

$a = $a ^ $b;

// $b = $a ^ $b = $a ^ $b ^ $b = $a;

$b = $a ^ $b;

// $a = $a ^ $b = $a ^ $b ^ $a = $a ^ $a ^ $b = $a

$a = $a ^ $b;

3、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

class Solution {

/**

* @param Integer[] $nums

* @return Integer

*/

function singleNumber($nums) {

$res = $nums[0];

for ($i = 1; $i < count($nums); $i++) {

$res = $res ^ $nums[$i];

}

return $res;

}

}

同类型题目

给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。

class Solution {

/**

* @param String $s

* @param String $t

* @return String

*/

function findTheDifference($s, $t) {

$res = $t[strlen($t) - 1];

for ($i = 0; $i < strlen($s); $i++) {

$res ^= $s[$i] ^ $t[$i];

}

return $res;

}

}

4、给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

思路:

使用位运算,把数字看成二进制字符串,二进制每4位对于一位16进制字符串,不断移动4位,转成16进制字符进行拼接。

算法:

定义16进制字符序列。

取出数字对应二进制字符的最后4位,num & 15【15的二进制字符串是'1111', 所以按位与的结果就是取后4位】,并获取对应16进制的字符hex[$num & 15]。

然后把num右移4位,获取下一个字符,拼接在上一个字符前。$res = hex[hex[num & 15] . $res;【>>算数位移,其中正数右移左边补0,负数右移左边补1。】

直到num为0, 或者$res的长度 >= 8。位移运算并不能保证num==0,需要使用32位int保证(对应16进制小于等于8位)

class Solution {

/**

* @param Integer $num

* @return String

*/

function toHex($num) {

if ($num == 0) {

return '0';

}

$hex = '0123456789abcdef';

$res = '';

while ($num != 0 && strlen($res) < 8) {

$res = $hex[$num & 15] . $res;

$num >>= 4;

}

return $res;

}

}

5、大写字符转小写

function toLowerCase($str) {

for ($i = 0; $i < strlen($str); $i++) {

$str[$i] = chr(ord($str[$i]) | 32);

}

return $str;

}

php位运算符与逻辑运算_位运算符及PHP中位运算的应用笔记相关推荐

  1. mysql里面的选择运算_在MySQL关系模型中,选择运算是在一个关系的所有元组中选择指定属性列,组成新关系。...

    [单选题]下列关于元素第一电离能的说法不正确的是( ) [填空题]We had already ____ contact with the museum. [判断题]DELETE语句功能是对表中所有记 ...

  2. 位宽512bit显卡_显卡知识:关于显卡位宽的基础知识科普

    显卡的位宽,准确应该说是显存的位宽.众所周知显卡的主要部件有GPU和显存,所谓显存位宽可以理解为数据从显存转移到GPU的通道的运载量,就是车间传送带的运输量. 由于买电脑的时候大家对显卡的显存大小过于 ...

  3. c语言与64位windows不兼容_微软发布可模拟 64 位 x86 程序的 ARM 版 Windows 10

    微软今天宣布推出可以在 ARM 架构 PC 上模拟 64 位 x86 程序的新版 Windows 10.这意味着,拥有 ARM PC 的用户,比如 Surface Pro X 可以安装 64 位 x8 ...

  4. java boolean 按位或_布尔运算符与按位运算符

    布尔运算符与按位运算符 我对何时应该使用布尔运算符与按位运算符感到困惑 and vs &, or vs | 有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果? 8个解决方案 56 ...

  5. 在学习Python基础中需要知道的知识点:运算符大全,收藏,以后方面查询(算术运算符、赋值运算符、比较运算符、位运算符、逻辑运算符、成员运算符、身份运算符、运算符优先级))

    一.算术运算符 运算符 描述 实例 + 加 - 两个对象相加 a + b 输出结果 30 - 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 - 两个数相乘或是返回一个被 ...

  6. 4、Python运算符、比较运算符、赋值运算符、位运算符、逻辑运算符、成员运算符、身份运算符、运算符优先级(学些笔记)

    4.1Python算术运算符 以下假设变量:a = 10,b=20 示例: # -*- coding: UTF-8 -*-a = 25 b = 3 c = 0c = a + b print(" ...

  7. Verilog HDL中位运算符、逻辑运算符和缩减运算符的区别

    文章目录 前言 一.单目运算符.双目运算符和三目运算符 二.位运算符 三.逻辑运算符 四.缩减运算符 五.总结 前言 我们在学习和理解Verilog HDL中的一些运算符的意义时,可能会对一些运算符的 ...

  8. 常见位操作及运算应用举例:1,C语言中位运算符异或“∧”的作用​​​​​​​2,异或运算的作用3,(与运算)、|(或运算)、^(异或运算)

    1 C语言中位运算符异或"∧"的作用: 异或运算符∧也称XOR运算符.它的规则是若参加运算的两个二进位同号,则结果为0(假):异号则为1(真).即0∧0=0,0∧1=1,1∧1=0 ...

  9. c语言位运算知乎,07-C语言运算符-指趣学院

    运算符基本概念 和数学中的运算符一样, C语言中的运算符是告诉程序执行特定算术或逻辑操作的符号 例如告诉程序, 某两个数相加, 相减,相乘等 什么是表达式 表达式就是利用运算符链接在一起的有意义,有结 ...

最新文章

  1. python流程控制-Python流程控制常用工具详解
  2. Socket(套字节)编程,客户端 服务器端的发送消息
  3. HTML+CSS+JS实现 ❤️酷炫的canvas全屏背景动画特效❤️
  4. 3gpp协议_C-V2X: 3GPP协议阅读前的一些准备
  5. Centos7yum源配置PID锁定问题
  6. java获取元素创建时间_Golang中使用Date进行日期格式化(沿用Java风格)
  7. 深延科技:基于深度学习的智能OCR识别技术大有可为
  8. 蓝屏dump分析教程,附分析工具WinDbg下载
  9. Roslyn 使用 Target 替换占位符方式生成 nuget 打包
  10. 山海经电子书古文/翻译白话文版发布,免费电子书。
  11. python累乘怎么写_Python3 实现列表元素求累和,求累乘
  12. 二元函数偏导数公式_二阶偏导数公式详解
  13. 转 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)
  14. 苹果手表Apple Watch 无法检查更新 iOS14.5 14.6 14.7
  15. 浅谈程序员35岁职业危机
  16. 思科防火墙NAT——实验
  17. 面试题--用友面试题--IQ题
  18. 用地预审与选址意见书
  19. 风险预测模型_慢性肾脏病孕妇妊娠风险预测模型的构建及验证
  20. Android 2.3 Gingerbreader 正式发布,向游戏开发者献媚

热门文章

  1. Vray-3.0 开箱宝典
  2. UE4 间接光照缓存
  3. Unreal、CryEngine、Gamebryo引擎介绍
  4. 存储过程+调用存储过程+无/带参的存储过程+in参数+out参数+int out参数+为参数设置默认值...
  5. 【excel技巧读书笔记015】同时关闭多张工作薄
  6. 受损虚拟机的修复方法
  7. Python:序列化
  8. python函数与方法的区别_python中函数和方法有哪些区别
  9. java 圆心_JAVA程序帮忙看下把
  10. html5中提供的绘图元素,HTML5中Canvas元素的使用总结