• C++ | 二进制小数以及对异域的理解


    注:我们默认1个字节用8个位 ,编号分别为7~1。

    1.二进制小数

    实际上,二进制表示法只能精确地表示多个1/2的幂的和,如3/4, 7/8,而1/3, 2/5等是无法精确表示的。

    2.对异或的理解

    粗暴理解就是男性和女性能生出孩子,否则就不行。不允许共存。

    异或运算其实就是半加器运算,不进位

    0 xor 0 =0

    0 xor 1 =1

    1 xor 1 =(1) 0

    1 xor 0 =1

    异或实际上就是判断两个输入逻辑值是否不同,如果不同则结果为1,相同则为0。若a=0,b=0,a异或b 两数相同,输出结果为0,结果与b相同;

    若a=0,b=1,a异或b 两数不同,输出结果为1,结果与b相同;

    若a=1,b=0,a异或b 两数不同,输出结果为1,结果与b相反;

    若a=1,b=1,a异或b 两数相同,输出结果为0,结果与b相反;

    3.用法:掩码

    按位运算符常用于掩码(mask),所谓掩码指的是一些设置为开(1)或关(0)的位组合。

    为什么叫其为掩码呢?

    我们把一个量与掩码结合后发生什么情况:

    例如:假设定义符号常量mas为2(即,二进制形式为00000010),只有1号位是1,其他位都是0

    flag =10010110b

    flags = flags & mark;

    把flags中除1号位以外的所有位都设置为0,因为使用按位与运算符(&)任何位与0组合都得0,1号位的值不变,(如果1号位是1,那么1&1得1;如果1号位是0,那么0&1=0),这个过程叫使用掩码,因为掩码中的0隐藏了flags中相应的位。

    可以这样类比,把掩码中的0看做不透明,1看做透明,表达式flags&mask相当于用掩码覆盖在flags的位组合上,只有mask为1的位才可见。

    4.用法:打开位(设置位)

    有时,需要打开一个值中的特定位,同时保持其他位不变。

    例如一台ibm pc 通过向端口发送值来控制硬件,例如,为了打开内置扬声器,必须打开一号位,同时保持其他位不变,这种情况可以使用按位或运算符(|)。

    flag=00001111b

    mark=10110110b

    flags |=mark;

    这样,(00001111)|(10110110)=(10111111)

    mark中为1的位,flags与其对应的位也为1,mark中为0的位,flag与其对应的位不变。

    这种方法根据mark中为1的位,把flags中对应的位设置位1,其他位不变。

    5.用法:关闭位(清空位)

    和打开特定的位类似,有时需要在不影响其他位的情况下关闭指定的位,假设要关闭flag中的0号位,同样,mark只有1号位为1(即,打开):

    flags =flags &~mark;

    有mark 除1号位为1以外,其他位全为0,所以~mark除1号位为0以外,其他位全为1,使用&,任何位与1组合都得本身,所以这条语句保持1号位不变,改变其他各个位,另外,使用&,任何位与0组合都得0,所以无论1号位的初始值是什么,都将其设置为0;

    例如:假设flags是00001111,mark是10110110,下面的表达式:

    flags & ~mark

    (00001111)&~(10110110)

    其结果为00001001,

    mask中为1的位在结果中都被设置(清空)为0,flags中与mark为0的位相应的位在结果中都未改变。

    可以使用以下的简化形式:

    flags &=~mark;

    6.用法:切换位

    切换位指的是打开已关闭的位,或关闭已打开的位,可以使用按位异或运算符(^)切换位。

    flags =flags ^mask;

    flags ^=mask;

    例如,假设flags是00001111,mask是10110110,

    flags ~mask

    (00001111)^(10110110);

    其结果为:

    (10111001)

    flags中与mas为1的位相对应的位都被切换了,mask为0的位相对应的位不变。

    7.用法:检查位的值

    有时需要检查某位的值,例如,flags中1号位是否被设置位1?不能这样直接比较flags和mask:

    if(flags==mask)

    puts(“wow”) //不能正常工作

    这样做即使flags的1号位为1,其他位的值会导致比较结果为假,因此,必须覆盖flags中的其他位,只用1号位和mask比较。

    if(flags&mask)==mask)

    puts(“wow”)

    比如flags=01010010 mask=00000010

    按位与运算后,得到00000010,与mask相等,即可判断1号位为1。

    由于按位运算符的优先级比==低,所以必须在flags &mask周围加上圆括号。

    为了避免信息漏过边界,掩码至少要与其覆盖的值宽度相同。

    最后,特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改...还有超多源码素材等学习资料,零基础的视频等着你!

    还没关注的小伙伴,可以长按关注一下:


     
  • 相关阅读:
    再回首Java第九天
    再回首Java第八天
    再回首Java一周记
    再回首Java第六天
    再回首Java第五天
    再回首Java第四天
    再回首Java第三天
    再回首Java第二天
    再回首Java第一天
    关于i++和++i理解
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14594034.html
Copyright © 2020-2023  润新知