C语言 逆时针旋转4x4位矩阵



我找到了一个代码片段,它将4x4位矩阵右旋转90度。我想做同样的操作,把它向左旋转90度。我花了一些时间摆弄这些位移,看看是否能让它逆时针旋转,但运气不好。

unsigned int rotate_right(unsigned short x)
{
x = (x & 0x0033u) << 2u | (x & 0x00CCu) << 8u | (x & 0xCC00u) >> 2u | (x & 0x3300u) >> 8u;
x = (x & 0x0505u) << 1u | (x & 0x0A0Au) << 4u | (x & 0xA0A0u) >> 1u | (x & 0x5050u) >> 4u;
return  x;
}

如何使用用于右旋转的方法向左旋转?我知道我可以向右旋转3次或者向右旋转一次,然后反转所有的位…但这感觉有点像作弊。必须有一种类似于右旋转的方法。

这是一个有几个测试场景用例的godbolt。https://godbolt.org/z/1Yecoz594

您可以反向操作以获得左旋转。反转两条线和位的方向移位,但您还必须调整位掩码,使其与顺时针旋转移位后的掩码相对应——顺时针旋转的源是逆时针旋转的目标,反之亦然。

例如顺时针旋转的表达式:

(x & 0x0033) << 2u

(x & (0x0033 << 2u)) >> 2u == (x & 0x00CC) >> 2u

整个函数是:

unsigned int rotate_left(unsigned short x)
{
x = (x & 0x0A0A) >> 1u
| (x & 0xA0A0) >> 4u
| (x & 0x5050) << 1u
| (x & 0x0505) << 4u;
x = (x & 0x00CC) >> 2u
| (x & 0xCC00) >> 8u
| (x & 0x3300) << 2u
| (x & 0x0033) << 8u;
return  x;
}

最新更新