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。

     

  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/aicro/p/1644151.html
Copyright © 2011-2022 走看看