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形式。但是,请注意,问题中的两行代码实际上执行的是根本不同的操作(正如其他回答者所指出的)。