gpt4 book ai didi

c++ - 按位旋转(循环移位)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:02 26 4
gpt4 key购买 nike

我试图用 C++ 编写一些关于“按位旋转”的代码,我想通过左移位来实现。我不知道如何编写代码,但我在“维基百科”中找到了一些这样的代码。

unsigned int rotl(unsigned int value, int shift) {
return (value << shift) | (value >> (sizeof(value) * CHAR_BIT - shift));
}

然后我试着让它工作,但是这段代码没有给出我预期的输出。前任。我有数字 unsigned int 12,二进制 1100,当我想用​​上面的代码按左 shif 进行按位旋转时,输出是 unsigned int 24 ,( 11000),它必须给出输出 unsigned int 9,因为如果我进行按位旋转(左移),第一个 MSB 位现在必须是第一个位,并且所有其他位必须向左移动一位。

你能帮助理解这是什么问题吗?或者我做错了什么。

谢谢。

最佳答案

下面的代码效果很好

#include <cstdint>

std::uint32_t rotl(std::uint32_t v, std::int32_t shift) {
std::int32_t s = shift>=0? shift%32 : -((-shift)%32);
return (v<<s) | (v>>(32-s));
}

std::uint32_t rotr(std::uint32_t v, std::int32_t shift) {
std::int32_t s = shift>=0? shift%32 : -((-shift)%32);
return (v>>s) | (v<<(32-s));
}

当然还有测试。

#include <iostream>

int main(){
using namespace std;
cout<<rotr(8,1)<<endl; // 4
cout<<rotr(8,-1)<<endl; //16
cout<<rotl(8,1)<<endl; //16
cout<<rotl(8,-1)<<endl; //4
cout<<rotr(4,60)<<endl; //64
cout<<rotr(4,61)<<endl; //32
cout<<rotl(4,3)<<endl; //32
cout<<rotl(4,4)<<endl; //64
return 0;
}

也许我提供的不是最快的实现,但肯定是可移植且稳定的实现

通用版本

#include <cstdint>

template< class T>
inline T rotl( T v, std::int32_t shift){
std::size_t m = sizeof(v)*std::numeric_limits<T>::digits;
T s = shift>=0? shift%m: -((-shift)%m)
return (v<<s) | (v>>(m-s));
}

template< class T>
inline T rotr( T v, std::int32_t shift){
std::size_t m = sizeof(v)*std::numeric_limits<T>::digits;
T s = shift>=0? shift%m: -((-shift)%m)
return (v>>s) | (v<<(m-s));
}

干杯:)

关于c++ - 按位旋转(循环移位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25799215/

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