如何通过环绕转换所有32位的4字节数组?

问题描述 投票:0回答:2

我正在尝试实现动画移位功能,这将允许我将所有(LAYERS * BYTES)LEDS移位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 ;
        }
    }
}
c multidimensional-array embedded pic
2个回答
2
投票

如果图层总是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 )
}

1
投票

另一种方法是使用联合。例如,

typedef union{
    uint8_t buff8[4];
    uint32_t buff32;
}led_buffer_t;

然后使用它来声明LED_Buffer(例如led_buffer_t LED_Buffer[LAYERS] = {0};

然后在这里使用循环移位答案:Circular shift in c

我在这里尝试过:https://onlinegdb.com/ByfcMY1sE

© www.soinside.com 2019 - 2024. All rights reserved.