gpt4 book ai didi

c - 如何重新排列位?

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:38 25 4
gpt4 key购买 nike

我必须重新排列一个字节中的位。我这样解决了问题:

uint8_t c;
uint8_t string[3];

string1[2] = (((c&(1<<0))!=0)<<6)|
(((c&(1<<1))!=0)<<1)|
(((c&(1<<2))!=0)<<0)|
(((c&(1<<3))!=0)<<2)|
(((c&(1<<4))!=0)<<3)|
(((c&(1<<5))!=0)<<4)|
(((c&(1<<6))!=0)<<5)|
(((c&(1<<7))!=0)<<7);

基本上:

如果bit0为1,将a向左移动6次。

如果 bit1 为 1,则向左移动 1 0 次。....

有没有更好的解决方案?

最佳答案

(((c&(1<<x))!=0)<<y)

也可以写成

((c&(1<<x)))<<(y-x))

马上,就消除了每位操作。 (请记住 y-x 是常量。)

但事实并非如此。如果您在整个过程中应用此转换,您会注意到一些位移动了相同的量。

(( c & 0x01 ) << 6 ) |
(( c & 0x02 ) ) |
(( c & 0x04 ) >> 2 ) |
(( c & 0x08 ) >> 1 ) |
(( c & 0x10 ) >> 1 ) |
(( c & 0x20 ) >> 1 ) |
(( c & 0x40 ) >> 1 ) |
(( c & 0x80 ) )

我们可以将它们分组。

(( c & 0x01 ) << 6 ) |
(( c & 0x82 ) ) |
(( c & 0x78 ) >> 1 ) |
(( c & 0x04 ) >> 2 )

我们将 30 个操作减少到 10 个。

关于c - 如何重新排列位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46329341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com