c - 如何通过环绕将 4 字节数组移位所有 32 位?

标签 c multidimensional-array embedded pic

我正在尝试实现一个动画移动功能,这将允许我将所有 (LAYERS*BYTES) LED 移动 32 位并重叠。我只能通过字节移位来完成,但这不是我需要的。

为了更好地理解这个想法,下面提供了图片:

enter image description here

我把它画出来了,其中 C 是一个进位位,它被移动到下一个字节的开头,4 个字节的最后一个元素被分配给第一个字节的第一个元素。

可能有更好的方法来实现这一点。感谢您提前提供的任何帮助。

附加信息:

void Shift_Right_Byte(void){
    for (int row = 0; row < LAYERS; row++) {
            for (int col = 0; col < BYTES; col++) {
                LED_Buffer[row][col] = LED_Buffer[row][(col + 1) % BYTES];
            }
        }
        delay(1000);
}

新功能:

void layer_rotate_right(void) 
{
    for (int row = 0; row < LAYERS; row++) {
        unsigned char carry = LED_Buffer[row][BYTES - 1] << 7 ;
        for( int i = 0; i < BYTES; i++ )
        {   
            unsigned char next_carry = LED_Buffer[row][i] << 7 ;
            LED_Buffer[row][i] = (LED_Buffer[row][i] >> 1) | carry ;
            carry = next_carry ;
        }
    }
}

最佳答案

如果图层始终为 4 字节,则具体的解决方案是将字节打包到 uint32_t 中并对其应用旋转。

给定:

void layer_rotate_right( uint8_t layer[4] ) 
{
    // Pack...
    uint32_t word = layer[0]<<24 | layer[1]<<16 | layer[2]<<8 | layer[3] ;

    // Rotate...
    uint32_t rotated = word << 31 | word >> 1 ;

    // Unpack...
    layer[0] = rotated >> 24 ;
    layer[1] = (rotated >> 16) & 0xff ;
    layer[2] = (rotated >> 8) & 0xff ;
    layer[3] = rotated & 0xff ;
}

然后:

for (int row = 0; row < LAYERS; row++) 
{
    layer_rotate_right( LED_Buffer[row] )
}

打包和拆包有些麻烦。给定适当的字节序和对齐方式,您可能会摆脱强制转换,但作为一种解决方案,它无法扩展。

对于任何大小的字节数组,一个更通用的解决方案是:

void layer_rotate_right( uint8_t* layer, int len ) 
{
    uint8_t carry = layer[len - 1] << 7 ;
    for( int i = 0; i < len; i++ )
    {   
        uint8_t next_carry = layer[i] << 7 ;
        layer[i] = (layer[i] >> 1) | carry ;
        carry = next_carry ;
    }
}

然后:

for (int row = 0; row < LAYERS; row++) 
{
    layer_rotate_right( LED_Buffer[row], BYTES )
}

关于c - 如何通过环绕将 4 字节数组移位所有 32 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819874/

相关文章:

c - 你如何理解下面的按位运算?

java - 如何修复 ArrayList 类型的类型不匹配错误?可能的多维数组?

arrays - Scheme 语言中的 3D 数组

c - XC8 中的不匹配比较

c++ - 格式化输出c++的问题

c - 取消引用指针数组

c - 如何检测是否支持双栈套接字?

scipy - 将 scipy.stats.gaussian_kde 与二维数据一起使用

c++ - C和C++中的编译器优化和临时分配

c - 就 C 中的速度和空间消耗而言,静态与全局