zoukankan      html  css  js  c++  java
  • 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。

     

  • 相关阅读:
    毛坯房装修步骤/过程
    编译方向是个值得考虑的选择(转发)
    暖气片安装常识
    装修,别忘了水电改造图纸
    新年走起
    装修中期需要实时监督 水电防水墙体拆改提前核定
    【CF1558D】TopNotch Insertions
    【洛谷P5008】锦鲤抄
    【UOJ#26】Game
    directx学习笔记之四:LPD3DXSPRITE,屏幕输出图片
  • 原文地址:https://www.cnblogs.com/aicro/p/1644151.html
Copyright © 2011-2022 走看看