我目前正在尝试使用简单的完整步骤来控制步进电机。这意味着我当前正在输出这样的值序列:
1000
0100
0010
0001
我认为一个简单的方法就是获取我的4位值,然后在每个步骤之后执行右旋转操作。 “代码”显然不遵循任何语法,仅用于说明我的想法:
step = 1000;
//Looping
Motor_Out(step)
//Rotate my step variable right by 1 bit
Rotate_Right(step, 1)
我的问题是,显然没有任何4位简单数据类型可用于此目的,如果我使用8位unsigned int,则最终会将1旋转到MSB,这意味着4位我实际上感兴趣的值,将在几步后变为0000。
我读过您可以使用结构和位域来解决此问题,但是我从中读到的大部分内容都告诉我,这是一个非常糟糕的主意。
最佳答案
这样做的算法很简单,它总是比表方法快:
constexpr unsigned rotate_right_4bit ( unsigned value )
{
return ( value >> 1 ) | ( ( value << 3 ) & 15 );
}
这将变成5行无分支的x86程序集:
lea eax, [0+rdi*8]
shr edi
and eax, 15
or eax, edi
ret
或者,或者,如果您实际上希望查看索引
{3, 2, 1, 0}
,则可以将它们分成两个函数,一个“增加”索引,另一个实际上计算值:constexpr unsigned decrement_mod4 ( unsigned index )
{
return ( index - 1 ) & 3;
}
constexpr unsigned project ( unsigned index )
{
return 1u << index;
}
关于c - 向右旋转4位值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40260563/