2013-05-11 61 views
0

我需要将64位整数的第n位设置为1; 有一个内在的(这里http://msdn.microsoft.com/en-us/library/z56sc6y4(v=vs.90).aspx记录):Visual Studio C编译器中是否存在单独的bitset64内部函数?

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

该做的工作。 我的问题是如果有一种方法只是做位设置(没有测试),并且如果使用bittestandset64忽略返回值的任何性能命中为目的。
我也有兴趣,如果有一种方法可以在GCC中使用(用于Intel Core2至i7)。

回答

1

内在点是利用特定的处理器指令,并使用选项来继续优化代码。在这种情况下,BTS,位测试和设置指令。没有专门的“位设置”指令。代码生成器将使用结果值关注您。如果您不使用它,那么它也不会生成将进位标志转换为位值的代码。

所以一组简单的,如:

_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指令做得更好,这已经很好了。

+0

我不知道如果我不使用返回值会产生什么。这解决了我的问题。 – 2013-05-12 05:59:10

相关问题