C++位运算 (转并完善)
1、“按位与”运算符(&)
(1) 与0 & 清零
(2) 与1 & 不变
(3) 保留某特定位
比如说想要保留左起第2,3,6,7位,可以& 01100110
(4) 测试某特定位
比如说想看左起第二位是否为1, 可以做如下判断
.if 98h & 01000000
左起第二位是1
.else
左起第二位不是1
2、“按位或”运算符(|)
(1) 按位或运算常用来对一个数据的某些位定值为1。
比如说需要将左起第2,4,5,6位置为1。只需要与上01011100
(2) 控制ZF标志位
当出现OR al, al的情况时,若al为0,那么ZF会被值为0.利用这个特性可以完成对某个以0为字符串尾的字符串的逐个考察并当考察完就转走。
例如,
;假设在00400000存放着“123”(在内存中,字符是以数字来表示的。所以参照ASCII表,字符1的ASCII分别为十进制数31,即在内存中存的是31,只是当将这段内存解读为字符时,根据ASCII表又得到字符1。所以当将“1”的ASCII码减去30得到的就是数字1,由于是ASCII存放方式,所以无论是“1”还是1都以1个byte方式存放)
MOV esi,00400000
MOV al, byte ptr [esi] ;拿出第一个字符,即“1”
_here:
SUB al, 30 ; 数字转换
INC esi ;指向下一个字符
MOV al, byte ptr [esi]
OR al, al
Jnz _here
;其他操作
3、“异或”运算符(^)
(1) 清零
当自己与自己异或,结果就是0
(2) 特定位异或1可使特定位翻转
比如说需要将低4位翻转,可以异或00001111
(3) 特定位异或0保持不变
(4) 交换两个值,不用临时变量
例如:a=3,即11(2);b=4,即100(2)。
想将a和b的值互换,可以用以下赋值语句实现:
a=a∧b;
b=b∧a;
a=a∧b;
a=011(2)
(∧)b=100(2)
a=111(2)(a∧b的结果,a已变成7)
(∧)b=100(2)
b=011(2)(b∧a的结果,b已变成3)
(∧)a=111(2)
a=100(2)(a∧b的结果,a已变成4)
等效于以下两步:
① 执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b)。
② 再执行第三个赋值语句: a=a∧b。
由于a的值等于(a∧b),所以b的值等于(b∧a∧b),
因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。
------------------------------------------------------------------------
email : aicrosoft1104@126.com
吃遍天下。