为了账号安全,请及时绑定邮箱和手机立即绑定

C+中循环移位(旋转)操作的最佳实践

C+中循环移位(旋转)操作的最佳实践

C++ C
拉莫斯之舞 2019-06-16 14:37:46
C+中循环移位(旋转)操作的最佳实践左移和右移操作符(<和>)已经在C+中可用。然而,我无法找到如何执行循环移位或旋转操作。如何执行“左转”和“右转”等操作?右转两次Initial --> 1000 0011 0100 0010应导致:Final   --> 1010 0000 1101 0000举个例子会有帮助。(编者注:许多常用的用C表示旋转的方式,如果旋转计数为零,或编译成不止一个旋转机器指令,就会有未定义的行为。这个问题的答案应该记录最佳实践。)
查看完整描述

3 回答

?
DIEA

TA贡献1820条经验 获得超2个赞

因为它是C+,所以使用内联函数:

template <typename INT> INT rol(INT val) {
    return (val << 1) | (val >> (sizeof(INT)*CHAR_BIT-1));}

C+11变式:

template <typename INT> constexpr INT rol(INT val) {
    static_assert(std::is_unsigned<INT>::value,
                  "Rotate Left only makes sense for unsigned types");
    return (val << 1) | (val >> (sizeof(INT)*CHAR_BIT-1));}


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 777 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信