C++ 什么';一次移动几个未签名字符以使它们从一个字符流向另一个字符的最快方法是什么?

C++ 什么';一次移动几个未签名字符以使它们从一个字符流向另一个字符的最快方法是什么?,c++,c,arrays,arduino,bit-shift,C++,C,Arrays,Arduino,Bit Shift,我们有以下数组 unsigned char pixelData[16][5] …表示用于向LED矩阵馈电的40x16 1bpp显示器 一次向上或向下移动一个像素很容易,因为我们只需更改第一个索引器。但是,由于第二个索引器表示整个字节,而不是单个像素,因此我们不确定将数据向左或向右移动的最有效方法 我的第一个想法是逐像素进行操作,但这当然会非常慢,每字节需要8个操作 我的下一个想法是将每个字节向左或向右移位,但将移位后的位存储在它旁边的一个字节中以备替换。这将使它降低到每字节三次运算(存储、移位

我们有以下数组

unsigned char pixelData[16][5]
…表示用于向LED矩阵馈电的40x16 1bpp显示器

一次向上或向下移动一个像素很容易,因为我们只需更改第一个索引器。但是,由于第二个索引器表示整个字节,而不是单个像素,因此我们不确定将数据向左或向右移动的最有效方法

我的第一个想法是逐像素进行操作,但这当然会非常慢,每字节需要8个操作

我的下一个想法是将每个字节向左或向右移位,但将移位后的位存储在它旁边的一个字节中以备替换。这将使它降低到每字节三次运算(存储、移位、替换),但如果您希望一次移位超过一个像素,则逻辑也会变得复杂,因为您还需要一个掩码

之后我的想法是将数组的特定成员强制转换为uint16,这样我就可以使用16位长度而不是8位长度来处理它们,这将把步骤从6(存储/移位/替换x2)减少到4(强制转换/存储/移位/替换)。。。但我仍然认为有一种更快的方法可以做到这一点。不过,如果你换了不止一个地方,你又回到了掩蔽问题上

也就是说,移动整行字节最有效的方法是什么


如果重要的话,这是在Atmel芯片上,特别是在Arduinos上。

如果您愿意在代码中包含一些汇编程序,Atmel AVR uC具有用于此目的的完美指令:ROR或ROL。它们通过进位保留和最后一次进位插入进行位移位。 ROR(x):x[b7]=进位;x=x>>1;进位=x[b0]

您只需执行这条指令5次就可以得到您想要的东西

编辑:类似于Arduino IDE的东西应该可以做到这一点(我还没有测试过它):

比特流将是:

ROL <value>:
    # Carry Register = 8th bit of the given value
    # value = value << 1
    # 1st bit of the value = Previous Carry Register)

ROL 0b10000001 # Result = 0b00000010 and Carry = 1
ROL 0b10000001 # Result = 0b00000011 and Carry = 1
ROL 0b00000001 # Result = 0b00000011 and Carry = 0
ROL 0b00000001 # Result = 0b00000010 and Carry = 0
ROL:
#进位寄存器=给定值的第8位

#你能在回答中给出一个简单的代码示例吗?以前从未在Arduino代码中使用过汇编,但我知道这是可能的。如果这样做更简单,只需使用1d阵列即可。问题是。。。如果我想把它向左移动三个像素,我必须把它称为十五次,对吗(每像素5次,乘以三个像素)?实际上,看看这个,这不就是把位从字节的一端旋转到另一端吗?我想把从byteA换出来的位子换成byteB。换句话说,从一个传送到另一个,而不是在同一个字节内传送。你在右边的轨道上,寻找RRX Rotate right w/Extend(这是唯一一个通过传送旋转的。ARM参考:@lornix Arduino使用Atmel AVR微控制器,而不是ARM芯片。根据:ROL的意思是通过传送向左旋转:
Rd(0)← C、 Rd(n+1)← Rd(n);C← Rd(7);
,与ROR类似。哦!抱歉,想法正确,指令集错误!继续!这里没什么可看的…继续!:)
ROL <value>:
    # Carry Register = 8th bit of the given value
    # value = value << 1
    # 1st bit of the value = Previous Carry Register)

ROL 0b10000001 # Result = 0b00000010 and Carry = 1
ROL 0b10000001 # Result = 0b00000011 and Carry = 1
ROL 0b00000001 # Result = 0b00000011 and Carry = 0
ROL 0b00000001 # Result = 0b00000010 and Carry = 0