• C/Cpp中的位运算符


    参考:C++.Primer.Plus(第6版)中文版].(美)普拉达 P856

    按位运算符

    & 与  (电路里的串联)   1&1=1 其他都是0    1&0=0 0&1=0 0&0=0
    | 或  (电路里的并联)   0|0=0 其他都是1    1|0=1 0|1=1  1|1=1
    ~ 非   取反       ~1 = 0 ;   ~0 = 1

    常用的按位运算符技术

    控制硬件时,常涉及打开/关闭特定的位或查看它们的状态。按位运算符提供了执行这种操作的途径。

    下面简要地介绍一下这些方法,在下面的示例中,lottabits表示一个值,bit表示特定位的值。位从右到左进行编号,从0开始,因此,第n位的值为2^n。例如,只有第3位为1的整数的值为2^3。一般来说,各个位都对应于2的幂。因此我们使用术语位(bit)表示2的幂;这对应于特定位为1,其他所有位都为0的情况。

    1.打开位

    下面两项操作打开 lottabits 中对应于 bit 表示的位:

    lottabits = lottabits | bit;
    lottabits |= bit;

    他们都将对应的位设置为1,不管这一位以前是多少。因为  0 OR 1 = 1;  1 OR 1 = 1。即 x OR 1 = 1

    2.切换位

    下面两项操作切换 lottabits中对应于bit表示的位。也就是说,如果位是关闭的,则将被打开;如果位是打开的,将被关闭:

    lottabits = lottabits ^ bit;
    lottabits ^= bit;

    对0和1执行XOR操作的结果为1,因此将关闭已打开的位;对1和1执行XOR操作的结果为0,因此将打开已关闭的位。

    lottabits中其他所有位都保持不变,这是因为对0和0执行XOR操作的结果为0,对1和0执行XOR操作的结果为1。即 x 与 0 异或 得到 它本身 x。

    3.关闭位

    下面的操作将关闭 lottabits 中对应于 bit 表示的位:

    lottabits = lottabits & ~bit;
    lottabits &= ~bit;

    该语句关闭相应的位,而不管它以前的状态如何。

    首先,运算符 ~bit 将原来为1的位设置为0,原来为0的位设置为1。对0和任意值执行AND操作都将得到0,因此关闭相应的位。
    lottabits中其他所有位都保持不变,这是因为对1和任意值执行AND操作时,该位的值将保持不变。

    4.测试位的值

    如果要确定 lottabits中对应于bit的位是否为1,则下面的测试不一定管用:

    if (lottabits == bit)

    这是因为即使 lottabits中对应的位为1,而其他位也可能为1。仅当对应的位为1,而其他位皆为0时,上述等式才为tue。

    因此修补的方式是,首先对 lottabits和bit执行AND操作,这样生成的值的对应位保持不变,因为对1和任何值执行AND操作都将保持该值不变;而其他位都为0,因为对0和任何值执行AND操作的结果都为0。

    正确的测试如下

      if (lottabits & bit == bit)  // testing a bit
    //或者简化为
      if (lottabits & bit)   //testing a bit

  • 相关阅读:
    [SCOI2009] Windy数
    [P1361] 小M的作物
    Wannafly Camp 2020 Day 2E 阔力梯的树
    2017百越杯反序列化writeup
    大美西安writeup
    Thinkphp的SQL查询方式
    Thinkphp的CURD
    记一次拿webshell踩过的坑(如何用PHP编写一个不包含数字和字母的后门)
    ThinkPHP的输出和模型使用
    ThinkPHP的运行流程-2
  • 原文地址:https://www.cnblogs.com/htj10/p/16792128.html
Copyright © 2020-2023  润新知