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。

     

  • 相关阅读:
    Navicat建表MySQL索引类型
    Feign调用全局异常处理解决
    ShardingJDBC、Mycat、drds对比
    MySQL之索引失效分析及优化相关
    SpringBoot2.X集成spring session redis实现session共享
    Redis的消息订阅/发布 Utils工具类
    MySQL索引类型区分
    handler使用(二)
    Android开发指南中文版(七)Content Providers
    Android消息处理(一)进程内通信
  • 原文地址:https://www.cnblogs.com/aicro/p/1644151.html
Copyright © 2011-2022 走看看