【问题标题】:Which is the best way to set a bit & why?设置位的最佳方法是什么?为什么?
【发布时间】:2019-11-10 04:05:19
【问题描述】:

如果我必须设置第 4 位,

最好的方法

方法一: a |= (1

方法二: 一个 |= 8

请详细说明区别。

【问题讨论】:

  • 执行时间没有区别。任何编译器都应该将1 << 3 常量折叠成8。在读取时,不同之处在于1 << 3 清楚地表明您正在设置第三位。

标签: c++ c++11 bit bitmask


【解决方案1】:

这两个是等价的。

使用1 << 3 对读者来说更清楚您要设置哪个位。而且因为这个表达式是一个编译时常量,编译器通常会在编译时计算这个值,所以没有运行时开销。

【讨论】:

    【解决方案2】:

    正如您所注意到的,它们都做同样的事情。让我专注于不同的部分:

    • (1
    • 8取数字8(二进制:0000 1000)

    如你所见,结果是同一个二进制数:0000 1000

    如果我必须在这两个之间进行选择,我会选择轮班,因为这更明显你想要一点。但是,就我个人而言,在创建这些数字时,我会选择第三种变体:0b0000'1000

    0b 代表二进制文字,从 C++14 开始可用,' 是数字分隔符(也是 C++14),类似于我之前使用的空格。

    但是,公平地说,假设a 是一个整数,我认为您使用了错误的工具来完成这项工作。创建std::bitset 是为了进行这些位操作。 (甚至在 C++98 中可用)

    #include <bitset>
    #include <iostream>
    
    int main(int, char**)
    {
        auto a = std::bitset<8>{};
        a.set(3 /*zero based indexing*/);
        std::cout << a.to_string() << std::endl;
        return 0;
    }
    

    程序的输出:00001000

    Code at Compiler Explorer

    如您所见,您可以使用set 方法轻松设置位,就像它是任何其他容器一样。有关您可以做的更多事情,请参阅documentation。

    【讨论】:

      猜你喜欢
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多