c/c++语言开发共享在C数组中进行按位运算的最有效方法是什么

我有一个C数组,如:

char byte_array[10]; 

另一个充当面具:

 char byte_mask[10]; 

我想在每个字节上获得另一个数组,该数组是第一个数据加上第二个使用按位运算的结果。

最有效的方法是什么?

谢谢你的回答。

     for ( i = 10 ; i-- > 0 ; ) result_array[i] = byte_array[i] & byte_mask[i]; 

    这适用于所有arrays和处理器。 但是,如果您知道arrays是字对齐的,则更快的方法是转换为更大的类型并执行相同的计算。

    例如,假设n=16而不是n=10 。 然后这会快得多:

     uint32_t* input32 = (uint32_t*)byte_array; uint32_t* mask32 = (uint32_t*)byte_mask; uint32_t* result32 = (uint32_t*)result_array; for ( i = 4 ; i-- > 0 ; ) result32[i] = input32[i] & mask32[i]; 

    (当然你需要一个适合uint32_t类型,如果n不是2的幂,你需要清理开头和/或结束,以便32位内容对齐。)

    变化:这个问题特别要求将结果放在一个单独的数组中,但是在原位修改输入数组几乎肯定会更快。

    如果你想让它更快,请确保byte_array的长度是4的倍数(在64位机器上为8),然后:

     char byte_array[12]; char byte_mask[12]; /* Checks for proper alignment */ assert(((unsigned int)(void *)byte_array) & 3 == 0); assert(((unsigned int)(void *)byte_mask) & 3 == 0); for (i = 0; i < (10+3)/4; i++) { ((unsigned int *)(byte_array))[i] &= ((unsigned int *)(byte_mask))[i]; } 

    这比每字节字节快得多。

    (注意,这是就地突变;如果你想保留原始的byte_array,那么你显然需要将结果存储在另一个数组中。)

     #define CHAR_ARRAY_SIZE (10) #define INT_ARRAY_SIZE ((CHAR_ARRAY_SIZE/ (sizeof (unsigned int)) + 1) typedef union _arr_tag_ { char byte_array [CHAR_ARRAY_SIZE]; unsigned int int_array [INT_ARRAY_SIZE]; } arr_tag; 

    现在int_array用于屏蔽。 这可能适用于32位和64位处理器。

     arr_tag arr_src, arr_result, arr_mask; for (int i = 0; i < INT_ARRAY_SIZE; i ++) { arr_result.int_array [i] = arr_src.int_array[i] & arr_mask.int_array [i]; } 

    试试这个,代码也可能看起来干净。

    需要了解更多c/c++开发分享在C数组中进行按位运算的最有效方法是什么,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享在C数组中进行按位运算的最有效方法是什么相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/979891.html

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐