0

我需要将 64 位整数的第 n 位设置为 1;有一个内在的(记录在这里http://msdn.microsoft.com/en-us/library/z56sc6y4(v=vs.90).aspx):

unsigned char _bittestandset64(
__int64 *a,
__int64 b
);

完成这项工作。我的问题是,是否有办法只进行位设置(无需测试),以及是否有任何性能影响使用 bittestandset64 忽略返回值。
如果有一种方法可以在 GCC 中使用(对于 Intel Core2 到 i7),我也很感兴趣。

4

1 回答 1

2

内在函数的重点是利用特定的处理器指令,并可以选择仍然优化代码。本例中的 BTS、Bit Test 和 Set 指令。“位设置”没有专门的指令。代码生成器会注意您使用结果值。如果您不使用它,那么它也不会生成将进位标志转换为位值的代码。

所以一个简单的集合,比如:

 _bittestandset64(&bits, 1);

产生:

 000007F6ED6812CE  bts         qword ptr [rax],1 

使用结果值时,例如:

 unsigned char value = _bittestandset64(&bits, 1);

产生:

 000007F7394E14A3  bts         qword ptr [rax],1 
 000007F7394E14A8  setb        al   
 000007F7394E14AB  mov         byte ptr [value],al  

你不能做得比单个 cpu 指令更好,这已经是最好的了。

于 2013-05-11T14:13:50.743 回答