C - OR 两个位图的最快方法
C - Fastest Way to OR two bitmaps
与这个问题非常相似:C fastest way to compare two bitmaps
但是我想要一个返回的位图(最有可能用 char * 表示的 0/1 值的文字序列),这是它们两个的按位或运算? None 的 mem___ 在这里似乎有意义?
位图保证大小相同。我也想存储按位或的结果,因此需要可以访问生成的位图。位图的大小在 10^5 字节的数量级。
long * a = (long *) getByteBufferData();
long * b = (long *) getByteBufferData(); //these return different pointers
for(int i = 0; i < SystemByteSize , i++){
a[i] = a[i] | b[i];
}
如果您修复循环限制(缓冲区的字节大小/long 的大小)并确保缓冲区 long
对齐,您可以确信编译器会很好地优化它。对于 x86,即使是旧版本的 gcc 也会使用 SSE 指令一次 or
16 个字节。
用 C 编写函数的一种简洁方法是:
void or(unsigned long *r, unsigned long *x, unsigned n) {
while (n--) *r++ |= *x++;
}
Here's gcc 4.8 output 在 -O4。使用针对特定处理器的手工编写的汇编语言可能会做得更好,但不会太多。
与这个问题非常相似:C fastest way to compare two bitmaps
但是我想要一个返回的位图(最有可能用 char * 表示的 0/1 值的文字序列),这是它们两个的按位或运算? None 的 mem___ 在这里似乎有意义?
位图保证大小相同。我也想存储按位或的结果,因此需要可以访问生成的位图。位图的大小在 10^5 字节的数量级。
long * a = (long *) getByteBufferData();
long * b = (long *) getByteBufferData(); //these return different pointers
for(int i = 0; i < SystemByteSize , i++){
a[i] = a[i] | b[i];
}
如果您修复循环限制(缓冲区的字节大小/long 的大小)并确保缓冲区 long
对齐,您可以确信编译器会很好地优化它。对于 x86,即使是旧版本的 gcc 也会使用 SSE 指令一次 or
16 个字节。
用 C 编写函数的一种简洁方法是:
void or(unsigned long *r, unsigned long *x, unsigned n) {
while (n--) *r++ |= *x++;
}
Here's gcc 4.8 output 在 -O4。使用针对特定处理器的手工编写的汇编语言可能会做得更好,但不会太多。