在c字节数组中按倍数计数
我试图降低二维条码中RGB像素的信息密度,以便进行扫描 我目前有一个3字节的数组,其中信息以在c字节数组中按倍数计数,c,C,我试图降低二维条码中RGB像素的信息密度,以便进行扫描 我目前有一个3字节的数组,其中信息以绑定的倍数编码,直到命中256,在这一点上它将循环到下一个字节;例如,如果bound为60: 0,0,0 -> 60,0,0 -> 120,0,0 -> 180,0,0 -> 240,0,0 -> (loop over) 0,60,0 -> ... 我怀疑有一种非常简单的方法可以做到这一点,但我只能通过for循环实现这一点 void multiples(u
绑定的倍数编码,直到命中256,在这一点上它将循环到下一个字节;例如,如果bound
为60:
0,0,0 -> 60,0,0 -> 120,0,0 -> 180,0,0 -> 240,0,0 -> (loop over) 0,60,0 -> ...
我怀疑有一种非常简单的方法可以做到这一点,但我只能通过for循环实现这一点
void multiples(uint32_t data){
uint32_t a[3] = {0, 0, 0};
uint8_t bound = 32;
for(int i = 0; i < data; i++){
a[0] += bound;
a[1] += bound*(a[0] - a[0]%256)/256;
a[2] += bound*(a[1] - a[1]%256)/256;
a[0] %= 256;
a[1] %= 256;
}
printf("%u,%u,%u\n",a[0],a[1],a[2]);
}
void倍数(uint32\t数据){
uint32_t a[3]={0,0,0};
uint8_t界=32;
对于(int i=0;i
如何以最佳方式完成此操作?您的示例与代码和解释不匹配。但是假设你的代码是正确的,我认为我们可以优化它。由于您不断向a[0]
添加bound
,因此a[0]
(例如,acc[0]
)的累积值将为
因此,a[0]
可以直接计算为acc[0]%256
。现在,每当acc[0]
跨越256的倍数时,a[1]
的累积值将添加bound
。所以,
acc[1] = (acc[0]/256)*bound
因此,a[1]
将是acc[1]%256
。累积a[2]
同样是acc[1]
与256的倍数相交的次数
acc[2] = (acc[1]/256)*bound
我认为要求必须是a[2]
才能小于256,因此a[2]
应该是acc[2]%256
。但是您可以保持它与代码中的acc[2]
相等。从240,0,0
到0,20,0
您应用了哪条规则?为什么0,20
?根据你的代码a[0]
应该是44,a[1]
,60紧跟在240,0,0
之后,直到达到256为止,在这一点上它将循环
如果256是最大值,而你是240,你加上60,然后循环,那么你应该有0,44,0
而不是0,20,0
是的,我的错,那是个打字错误。我本来是用20块来演示的,但觉得时间太长了,所以我换成了60块。我一定忘了更改它。我只是注意到,这在我自己的代码中可能也是一个问题,当给定一个60的界,5作为一个值时,您的代码返回44,60,0
,而不是0,60,0
。是的,对于您尝试执行的操作,我也感到困惑。所以我开始优化你的代码。我仍然不理解问题陈述。也许你可以说得更清楚些。但我仍然认为答案应该是这样的。你是对的,再一次,为打字错误感到抱歉。你的代码确实有效;最后,我用一个uint8\u t
等于bound*(256/bound)
的值替换掉了256。非常感谢。
acc[2] = (acc[1]/256)*bound