【发布时间】:2019-11-10 04:05:19
【问题描述】:
如果我必须设置第 4 位,
最好的方法
方法一: a |= (1
方法二: 一个 |= 8
请详细说明区别。
【问题讨论】:
-
执行时间没有区别。任何编译器都应该将
1 << 3常量折叠成8。在读取时,不同之处在于1 << 3清楚地表明您正在设置第三位。
如果我必须设置第 4 位,
最好的方法
方法一: a |= (1
方法二: 一个 |= 8
请详细说明区别。
【问题讨论】:
1 << 3 常量折叠成8。在读取时,不同之处在于1 << 3 清楚地表明您正在设置第三位。
这两个是等价的。
使用1 << 3 对读者来说更清楚您要设置哪个位。而且因为这个表达式是一个编译时常量,编译器通常会在编译时计算这个值,所以没有运行时开销。
【讨论】:
正如您所注意到的,它们都做同样的事情。让我专注于不同的部分:
如你所见,结果是同一个二进制数: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
如您所见,您可以使用set 方法轻松设置位,就像它是任何其他容器一样。有关您可以做的更多事情,请参阅documentation。
【讨论】: