Binary 擦除位集中单个位的最有效方法是什么?是XOR还是AND/NOT?

Binary 擦除位集中单个位的最有效方法是什么?是XOR还是AND/NOT?,binary,xor,bitset,Binary,Xor,Bitset,我有一个大的位集,我想经常重置其中的单个位。哪种方法更快 a) bitset[word\u index]^=1它们做的事情不同 选项a将翻转给定位;选项b将清除它。选择真正反映你意图的。如果您想清除位,但碰巧知道它将始终处于设置状态,我会使用选项b,因为它更清楚地说明了“清除位”部分 当你说你想“经常”做这件事的时候——这件事有多频繁?您是否有证据表明这是您的应用程序的瓶颈?如果不是,为什么你对最快的方式而不是最易读的方式感兴趣?他们做的不是同一件事 选项a将翻转给定位;选项b将清除它。选择真正

我有一个大的位集,我想经常重置其中的单个位。哪种方法更快


a)
bitset[word\u index]^=1它们做的事情不同

选项a将翻转给定位;选项b将清除它。选择真正反映你意图的。如果您想清除位,但碰巧知道它将始终处于设置状态,我会使用选项b,因为它更清楚地说明了“清除位”部分


当你说你想“经常”做这件事的时候——这件事有多频繁?您是否有证据表明这是您的应用程序的瓶颈?如果不是,为什么你对最快的方式而不是最易读的方式感兴趣?

他们做的不是同一件事

选项a将翻转给定位;选项b将清除它。选择真正反映你意图的。如果您想清除位,但碰巧知道它将始终处于设置状态,我会使用选项b,因为它更清楚地说明了“清除位”部分


当你说你想“经常”做这件事的时候——这件事有多频繁?您是否有证据表明这是您的应用程序的瓶颈?如果没有,为什么您对最快的方式而不是最可读的方式感兴趣?

假设您的代码正确地完成了您想要的:这被称为微优化

不太可能有任何实质性的区别。一个好的优化编译器将以任何方式生成快速代码


建议您在特定情况下进行基准测试。(同时,建议您编写单元测试)

假设您的代码正确地执行了您想要的操作:这被称为微优化

不太可能有任何实质性的区别。一个好的优化编译器将以任何方式生成快速代码


建议您在特定情况下进行基准测试。(同时,建议您编写单元测试)

如果您想清除位置N处的位,您必须设置一个掩码,在位置N处为0,在其他地方为1,然后使用按位and运算符,如下所示:

a &= ~(1 << N);
a |= (1 << N);
a ^= (1 << N);
原因有二:

(1) 通常情况下,3、5和9不是文本,而是为更好的可读性而定义的常量。
(2) 编译器将在编译时将其转换为该值(假设您使用常量),无需降低代码的可读性。

如果您想清除位置N处的一个位,则必须设置一个掩码,在位置N处使用0,在其他任何位置使用1,然后使用按位and运算符,如下所示:

a &= ~(1 << N);
a |= (1 << N);
a ^= (1 << N);
原因有二:

(1) 通常情况下,3、5和9不是文本,而是为更好的可读性而定义的常量。
(2) 不管怎样,编译器都会在编译时将其转换为常量(假设您使用常量),无需降低代码的可读性。

是的,我知道区别;在操作之前将设置一个位,因此这两个位在此上下文中是相等的。当我说“频繁”时,我的意思是每100秒有很多次;在操作之前将设置一个位,因此这两个位在此上下文中是相等的。当我说“频繁”时,我的意思是每100秒有很多次。谢谢,但在现代CPU上哪一次更快?AND/NOT组合是两条指令,XOR是一条指令。它在现代CPU中发挥作用吗?@axilmar AND/NOT在我熟悉的任何指令集体系结构中都不是一个统一的指令,而XOR通常是这样的,所以如果您有一种情况可以等效地适应其中一种,那么请务必使用XOR形式。但是,请注意,您问题中的两行代码实际上执行的是根本不同的操作(正如其他回答者所指出的)。谢谢您,但在现代CPU上哪一行更快?AND/NOT组合是两条指令,XOR是一条指令。它在现代CPU中发挥作用吗?@axilmar AND/NOT在我熟悉的任何指令集体系结构中都不是一个统一的指令,而XOR通常是这样的,所以如果您有一种情况可以等效地适应其中一种,那么请务必使用XOR形式。但是,请注意,问题中的两行代码实际上执行的是根本不同的操作(正如其他回答者所指出的)。