【发布时间】:2011-09-29 14:52:57
【问题描述】:
我解决了这个问题,但不知道如何以一种好的方式发布它,所以我编辑了这个帖子并将解决方案放在它的末尾。
在 C 中需要帮助,尝试将字节位转换为相反的顺序。
我想让Step1[] = {1,0,0,1,0,0,0,0}; 变成{0,0,0,0,1,0,0,1}。
void Stepper(void)
{
static uint8_t Step1[] = {1,0,0,1,0,0,0,0};
BridgeControl(Step1);
}
void BridgeControl(unsigned char *value)
{
uint8_t tempValue;
uint8_t bit = 8;
uint8_t rev = 1;
if (rev) // CW otherwise CCW
{
tempValue = *value;
do{
if(tempValue) // Right-shift one
tempValue = 1 >> 1;
else
tempValue = 0 >> 1;
}while(--bit, bit);
*value = tempValue;
}
我知道 bridcontrol 完全错误,在这里我需要帮助! 亲切的问候
新代码:
void BridgeControl(uint8_t *value)
{
// For example, initial value could be 1001000 then I
// would like the outcome to be 00001001
uint8_t tempValue;
uint8_t bit = 3;
uint8_t rev = 1;
if (rev) // CW otherwise CCW
{
tempValue = *value; //so... its 0b10010000
do{
tempValue >>=1; //1st this produce 01001000
tempValue = 0 >> 1; //1st this produce 0010 0100
//2nd time produce 0001 0010
//3d time produce 0000 1001
}while(--bit, bit);
*value = tempValue;
}
M1BHI = value[7];
M1BLI = value[6];
M1AHI = value[5];
M1ALI = value[4];
M2BHI = value[3];
M2BLI = value[2];
M2AHI = value[1];
M2ALI = value[0];
}
解决方案:
void BridgeControl(uint8_t value)
{
uint8_t tempvalue[8];
uint8_t i = 8;
uint8_t cont;
cont = value;
do{
value = value >> i-1;
value = value & 1;
tempvalue[8-i] = value;
value = cont;
}while(--i,i);
M1BHI = tempvalue[7];
M1BLI = tempvalue[6];
M1AHI = tempvalue[5];
M1ALI = tempvalue[4];
M2BHI = tempvalue[3];
M2BLI = tempvalue[2];
M2AHI = tempvalue[1];
M2ALI = tempvalue[0];
}
如果我想要数组中位的相反顺序,只需将tempvalue[8-i] 更改为tempvalue[i-1]。
【问题讨论】:
-
为什么人们投反对票?这是一个合法的问题,并且 OP 在发布到这里之前已经明显地尝试了一些东西(它在问题中!)。
-
您谈论的是位,但展示了一个整数数组的示例。我对您要做什么感到困惑。通过该示例,您似乎正在尝试反转整数数组的顺序。
-
这是 C# 吗?看起来更像是 C# 和 C (uint8_t, char*) 的混合体......
-
这是有效的 c# 代码吗?对我来说它看起来像 c...可能是错误的标签?
-
他在不安全的 C# 代码中使用了指针。他正在尝试用 C#
编写 C/C++ 代码。各有各的...
标签: c bit-manipulation