刚无意在一篇文章中看到了位运算(&、|)和逻辑运算(&&、||)的介绍,想起了自己薄弱的基础知识,于是百度了几把总结了下。
首先从概念上区分下,位运算是将运算符两边的数字换算成二进制(例:0000010001)后比较相同位置上的0、1进行运算的。逻辑运算即比较运算符两边的逻辑值(true或false)。概念比较抽象,下边借助实际例子比较下。
位运算
先将每个数转换成二进制,然后进行,位或(|)表示相对应的每位至少有一个为1,则结果为1,只有两个都为0,结果才为0.位与(&)表示相对应的两位必须都为1,结果才为1,否则为0。位异或(^)比较特殊,它比较的是如果两个不同则值为1(如:(1、0)(0、1)),相同(如:(1、1)(0、0))则为0。
例如: 3 |2
11 //二进制的3
10 //二进制的2
--------------------
11 //二进制的3
例如: 3 & 2
11
10
---------------------
10 //二进制的2
例如: 3^2
11
10
---------------------
01 //二进制的1
该例子介绍的是位运算的原理,注意下这里位运算|的结果是3,&的结果是2 这里刚好和比较的数字2、3重复只是个巧合,请不要以为位运算的结果是两个数字中的一个。
逻辑运算
先将逻辑运算符(&& ||)两边的表达式都换算成逻辑值(true、false),逻辑或(||)表示如果两个值至少有一个为ture,则结果为true,只有两个都为false,结果才为false。逻辑与(&&)表示两个都为true,结果才为true,否则为false。这里比较简单,就不做例子介绍了。
作用
逻辑运算的作用相信大家都知道,下边来介绍下位运算的作用:
一、按位与 &
1、 清零特定位 (mask中特定位置0,其它位为1,s=s&mask) s=s&mask
2、取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask) s=s&mask
二、按位或 |
常用来将源操作数某些位置1,其它位不变
三、按位异或
1、使特定位的值取反 (mask中特定位置1,其它位为0 s=s^mask)
2、把一个数自清零,如 a=a xor a 不管a是多少,最后a都等于零
为了让大家对位运算的作用更清晰些,下边再举个例子:
按位与运算通常用来对某些位清0或保留某些位。
例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
高八位清0,保留低八位,只要用一个数前边8位为0(&的情况下有一个为0即为0,就意味着清空没值了)后八位为1 (1与原数字(0、1)比较后值还为原数字的值,意味着保留原值)即可成功,那么这个数就是0000000011111111即255。