• 第一讲小结(位运算)


    第一讲的作业是位运算。

    位运算主要有几个妙用:

    • 按位与“&”
      可以将某些位清零的同时保留其他位不变。
      也可以获取某变量中的某一位
      思考:0&1还是0,1&1还是1,可以保证不变不管是1还是0&0都是0,所以可以清零.
      e.g. n的低8为都置为0,其他位不变:n&=0xffffff00;
        判断n的第7位是否为1:n&0x80
      note:int变量是32位2进制也就是8位16进制。
    • 按位或“|”
      可以将某些位置变成1,其他位不变。
      思考:1|0还是1,0|0还是0,保证不变。不管是1还是0,|1都为1,所以可以变为1。
    • 按位抑或“^”
      将某些位取反,保留其他位不变。
      思考:1^0还是1,0^0还是0,保证不变。1^1为0,0^1为1,所以可以取反。
      特点:a^b=c, c^b=a,  c^a=b (穷举法证明)
      应用:交换两个变量的值
      int a = 5, b = 7;
      a = a^b;
      b = b^a;
      a = a^b;
    • 思考题:使表达式的值和a的第n位相同. (a>>n)&1

    作业:

    1.写出函数中缺失的部分,使得函数返回值为一个整数,该整数的第i位和m的第i位相同,其他位和n相同

    return (m&(1<<i))|(n&(~(1<<i))); 

    //m&(1<<i)把m的第i位取出来
    //然后把n的第i位置0;(这样保证第三步时第i位与m相同 )
    //然后两者或

    2.写出函数中缺失的部分,使得函数返回值为一个整数,该整数的左边i位是n的左边i位取反,其余位和n相同

    return n^(-1<<(32-i)); 

    //注意整型是32位
    //第一位是符号位
    //-1的补码是1111 1111,负数的补码是绝对值部分取反+1
    //想要搞出一个111000000 ,所以左移32-i位,那么右边多出32-i个0,左边就剩i个1

  • 相关阅读:
    oracle锁---原理篇
    SML + NL + HJ
    Oracle中varchar,varchar2,nvarchar,nvarchar2的区别
    oracle 一致读原理
    commit 流程
    IMPDP NETWORK_LINK参数
    WINDOWS访问虚拟机RedHat搭配的Apache2服务器
    初识malloc函数
    好吧,又失眠
    休息一天
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/12395371.html
Copyright © 2020-2023  润新知