首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用bit_permute_step代替手动位操作

如何用bit_permute_step代替手动位操作
EN

Stack Overflow用户
提问于 2022-03-11 17:41:18
回答 1查看 60关注 0票数 1

如何用http://programming.sirrida.de/perm_fn.html#bit_permute_step替换以下手动逻辑?

代码语言:javascript
复制
 unsigned int ConvertRGBAToBGRA(unsigned int v) {
    unsigned char r = (v)& 0xFF;
    unsigned char g = (v >> 8) & 0xFF;
    unsigned char b = (v >> 16) & 0xFF;
    unsigned char a = (v >> 24) & 0xFF;
    return (a << 24) | (r << 16) | (g << 8) | b;
};

是否有更好的方法使用http://programming.sirrida.de/perm_fn.html#bit_permute_step来完成上述操作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-11 18:06:58

是,即:

代码语言:javascript
复制
return bit_permute_step(v, 0x000000ff, 16);

由掩码0x000000ff指示的0x000000ff比特包含r组件,bit_permute_step将将它们与左侧对应的位16 (距离参数)进行交换,后者对应于vb组件。因此,bit_permute_step(v, 0x000000ff, 16)将与b交换r,从而将RGBA转换为BGRA (也将BGRA转换为RGBA,因为交换是它自己的逆)。

这也可以通过置换计算器:http://programming.sirrida.de/calcperm.php找到。

使用索引16 17 18 19 20 21 22 23 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 24 25 26 27 28 29 30 31 (源索引)并禁用位组移动.

32位整数的C++实现(也可作为C代码使用)可以是:

代码语言:javascript
复制
uint32_t bit_permute_step(uint32_t x, uint32_t m, uint32_t shift) {
    uint32_t t;
    t = ((x >> shift) ^ x) & m;
    x = (x ^ t) ^ (t << shift);
    return x;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71442595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档