C++位运算 (转并完善)

1按位与运算符(&

1 0 & 清零

2 1 & 不变

3 保留某特定位

              比如说想要保留左起第2367位,可以& 01100110

4 测试某特定位

              比如说想看左起第二位是否为1 可以做如下判断

                     .if   98h & 01000000

                            左起第二位是1

                     .else

                            左起第二位不是1

 

2按位或运算符(|

1 按位或运算常用来对一个数据的某些位定值为1

比如说需要将左起第2456位置为1。只需要与上01011100

2 控制ZF标志位

              当出现OR al, al的情况时,若al0,那么ZF会被值为0.利用这个特性可以完成对某个以0为字符串尾的字符串的逐个考察并当考察完就转走。

例如,

;假设在00400000存放着“123”(在内存中,字符是以数字来表示的。所以参照ASCII表,字符1ASCII分别为十进制数31,即在内存中存的是31,只是当将这段内存解读为字符时,根据ASCII表又得到字符1。所以当将“1”的ASCII减去30得到的就是数字1,由于是ASCII存放方式,所以无论是“1”还是1都以1byte方式存放

 

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,即112);b=4,即1002)。
想将a和b的值互换,可以用以下赋值语句实现:
   
a=ab;
   
b=ba;
   
a=ab;
a=011(2)
   
(∧)b=100(2)
a=111(2)ab的结果,a已变成7)
   
(∧)b=100(2)
b=011(2)ba的结果,b已变成3)
   
(∧)a=111(2)


a=1002)(ab的结果,a已变成4)
等效于以下两步:
   
执行前两个赋值语句:a=a∧b;b=b∧a;相当于b=b(ab)
   
再执行第三个赋值语句: a=a∧b。

由于a的值等于(a∧b),所以b的值等于(b∧a∧b),

因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。

 

原文地址:https://www.cnblogs.com/aicro/p/1644151.html