gpt4 book ai didi

c - 按位循环左移函数

转载 作者:太空狗 更新时间:2023-10-29 16:53:04 24 4
gpt4 key购买 nike

我正在尝试实现一个向左旋转的函数,该函数将整数 x 向左旋转 n 位

  • 例如:向左旋转(0x87654321,4) = 0x76543218
  • 法律行动:~ & ^ | + << >>

到目前为止我有这个:

int rotateLeft(int x, int n) {
return ((x << n) | (x >> (32 - n)));
}

我已经意识到它不适用于有符号整数..有没有人知道如何解决这个问题?

所以现在我尝试了:

int rotateLeft(int x, int n) {
return ((x << n) | ((x >> (32 + (~n + 1))) & 0x0f));
}

并收到错误:

错误:测试 rotateLeft(-2147483648[0x80000000],1[0x1]) 失败......给出 15[0xf]。应该是 1[0x1]

最佳答案

当前对编译器友好的循环的最佳实践是 this community-wiki Q&A .来自 wikipedia 的代码不能用 clang 或早于 5.1 的 gcc 生成非常好的 asm。

Wikipedia 上有一个关于位旋转的非常好的、详细的解释,也就是循环移位。 .

从那里引用:

unsigned int _rotl(const unsigned int value, int shift) {
if ((shift &= sizeof(value)*8 - 1) == 0)
return value;
return (value << shift) | (value >> (sizeof(value)*8 - shift));
}

unsigned int _rotr(const unsigned int value, int shift) {
if ((shift &= sizeof(value)*8 - 1) == 0)
return value;
return (value >> shift) | (value << (sizeof(value)*8 - shift));

在您的情况下,由于您无权访问乘法运算符,因此可以替换 *8<< 3 .

编辑 您还可以删除 if给出你不能使用 if 的声明的声明.这是一种优化,但没有它您仍然可以获得正确的值。

请注意,如果您真的打算在 signed 上循环位整数,旋转结果的解释将取决于平台。具体要看平台是否使用Two's ComplementOne's Complement .我想不出旋转有符号整数的位有意义的应用程序。

关于c - 按位循环左移函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10134805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com