我目前正在尝试使用简单的完整步骤来控制步进电机。这意味着我当前正在输出这样的值序列:

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/

10-11 18:08