标签:

位运算应用口诀

清零取位要用与,某位置一可用或

若要取反和交换,轻轻松松用异或

移位运算

要点 1 它们都是双目运算符,两个运算分量都是整形,结果也是整形。

2 "<

3 ">>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。

4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0。

位运算符的应用 (源操作数s 掩码mask)

(1) 按位与-- &

1 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)

2 取某数中指定位 (mask中特定位置1,其它位为0,s=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是奇数还是偶数

a&1   = 0 偶数

a&1 =   1 奇数

(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

(3) 将int型变量a的第k位清0,即a=a&~(1<

(4) 将int型变量a的第k位置1, 即a=a|(1<

(5) int型变量循环左移k次,即a=a<>16-k   (设sizeof(int)=16)

(6) int型变量a循环右移k次,即a=a>>k|a<<16-k   (设sizeof(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)

原文http://www.phpip.com/program/php/A62009905P/21834.html

标签:

php二进制应用位运算,【转】PHP 位运算应用口诀相关推荐

  1. 『ACM-算法-lowbit』算法竞赛进阶指南--lowbit运算,找到二进制下所有是1的位

    写在前面:我们主要还是分享算法的模板,而不是去刨析算法的原理! 主要思想是,对于非负整数n,输出n最低位的1所在位,并不断把n赋值成n-(n&-n),直至n=0. 为了提高效率,我们使用Has ...

  2. x86架构下 CF与OF标志位 带符号和无符号运算 详解

    针对能够影响OF和CF标志位的指令,一般来说是涉及到数据运算的指令,这里使用add举例,即不区分有无符号的加法指令,参与运算的数据,从二进制层级去考虑. CF标志位 对于CF,它是carry flag ...

  3. php的位运算,php的位运算详解

    php的运算符有一类是位运算的,本文主要和大家分享php的位运算详解,希望能帮助到大家. 一:& And按位与 $a&$b 将把二进制$a和二进制$b位数都为1的设为1,其他位为0 例 ...

  4. java 位与运算_java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 正数直接取二进 ...

  5. c语言位运算符的应用,c语言位运算(c语言位运算符的用法)

    a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...

  6. Java位运算总结:位运算用途广泛

    前天几天研究了下JDK的Collection接口,本来准备接着研究Map接口,可是一查看HashMap类源码傻眼咯,到处是位运算实现,所以我觉得还是有必要先补补位运算知识,不然代码看起来有点费力.今天 ...

  7. python使用位运算实现整数加法运算

    位运算是二进制的一种基础运算,在生产中经常用来加密.下面是使用Python位运算来实现加法运算: 主要用到三个位运算符:异或^,和与&.左移位<<.对于异或,同位置数字不同则为1, ...

  8. 假设我们在对有符号值使用补码运算的32位机器人运行代码。对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移

    假设我们在对有符号值使用补码运算的32位机器人运行代码.对于有符号值使用的是算术右移,而对于无符号值使用的是逻辑右移.变量的声明和初始化如下: int x = foo(); //任意值 int y = ...

  9. 位运算:按位与、按位或、按位异或、按位左移、按位右移

    目录 一.基础知识补充 (1)位运算 (2)二进制的详细操作 二.位运算 (1)按位与(&) (2)按位或(|) (3)按位异或(^) (4)按位左移(<<) (5)按位右移(&g ...

  10. 设置二进制或者16/32位的某一位的值

    设置某一位的值 传送门:获取二进制或者16/32位的某一位的值 1 | 任何值 = 1 ,任何值&0 = 0 [利用这两点进行设置值] 上代码 //获取二进制某一位的值 uint8_t get ...

最新文章

  1. 码云gitee最大文件限制
  2. Python学习之数组
  3. Windows Server 2012改造成Windows8的方法(转载)
  4. 启明云端WT516P6Core离线语音模块发布后,开发者朋友提出的问题最多的是:是否可以自己编译指令
  5. Chapter4 Java流程控制之选择结构
  6. (4) 百度2011研发工程师笔试卷
  7. numpy 函数一:linspace
  8. css摇曳的_HTML5+CSS3实现树被风吹动摇晃
  9. Linux安装中文字体_宋体
  10. SpringCloud核心组件讲解
  11. 计算机维吾尔语键盘用法,维吾尔语键盘练习软件_西域新疆
  12. 如何同步企业微信的标签?
  13. 电脑桌面图片变成白色的解决方案
  14. 微软推出Azure Sphere漏洞奖励计划,最高奖金10万美元
  15. session是什么
  16. 如何查看mysql库中表的创建语句
  17. rgb与16进制颜色是如何相互转换的?
  18. 译码器和数据选择器的使用-实现多输入逻辑函数
  19. 写代码python用什么笔记本好_写代码对电脑有要求吗?什么电脑适合写代码?
  20. 暴风影音使用的小技巧

热门文章

  1. 追逐算法之--牛鞭的子弹是怎样练成的(6)--贝塞尔强化
  2. Python || 输出两两组合
  3. C语言:题目:将输入的一个字符串按反序存放
  4. 开关电源PCB设计中的走线技巧
  5. 基于MATLAB与VC混合编程的数字均衡器设计
  6. u88财富快车流氓软件RK驱动分析
  7. JAVA专题---计算思维
  8. 涂鸦智能SoC零代码开发接入
  9. 北京大学王立威教授:机器学习理论的回顾与展望
  10. 如何在Ubuntu 20.04的Anaconda不同环境中安装不同的CUDA版本(2020年8月)