2015-11-23 59 views
1

我有8个字段的字符串数组。每场8位给我64位内存在这种类型的单个字符串中。我想为这个字符串数组创建旋转函数。对于简单的字符串20(十六进制)功能RotateLeft(string, 1)给我40,就像在旋转。最大旋转值为64,则函数必须返回发送的字符串(RotateLeft(string, 64) == string)。我需要左右旋转。我试图创建这样的东西:C++中的字符串旋转(按位旋转)

std::string RotateLeft(std::string Message, unsigned int Value){ 
    std::string Output; 
    unsigned int MessageLength = Message.length(), Bit; 
    int FirstPointer, SecondPointer; 
    unsigned char Char; 

    for (int a = 0; a < MessageLength; a++){ 
     FirstPointer = a - ceil(Value/8.); 
     if (FirstPointer < 0){ 
      FirstPointer += MessageLength; 
     } 
     SecondPointer = (FirstPointer + 1) % MessageLength; 

     Bit = Value % 8; 
     Char = (Message[FirstPointer] << Bit) | (Message[SecondPointer] & (unsigned int)(pow(2, Bit) - 1)); 
     Output += Char; 
    } 
    return Output; 
} 

它工作的价值64,但不适用于其他值。为了简单的HEX字符串(函数获取字符串元素作为十进制值,但它是为了更好的阅读)当我发送这个值:243F6A8885A308D3并执行RotateLeft(string, 1)我收到A6497ED4110B4611。当我在Windows Calc中检查它时,它现在是有效值。任何人都可以帮助我,并显示我犯的错误?

+0

难道我得到它的权利,你有存储为字符串十六进制数,你要旋转的十六进制值(而不是字符串中的实际字符)? – user463035818

+0

@ tobi303不,十六进制值只能预览。我将这个值转换为十进制。 – ventaquil

+0

然后我很困惑,因为'20'旋转的字符串不是'40'。 – user463035818

回答

1

在字符串中有一个十六进制值,您想旋转它,就好像它实际上是一个数字。你可以只将其更改为实际数量,然后回一个字符串:

// Some example variables. 
uint64_t x, shift = 2; 
string in = "fffefffe", out; 

// Get the string as a number 
std::stringstream ss; 
ss << std::hex << in; 
ss >> x; 

// Shift the number 
x = x << shift; 

// Convert the number back into a hex string 
std::ostringstream ss2; 
ss2 << std::hex << x; 

// Get your output. 
out = ss2.str(); 

Here is a live example.

2

我不知道我是否正确理解你想做什么,但对我来说,看起来你正在做一件相当简单的事情,而且很复杂。当转移号码时,我不会把它们放在一个字符串中。然而,一旦你拥有了它作为一个字符串,你可以这样做:

std::string rotate(std::string in,int rot){ 
    long long int number; 
    std::stringstream instream(in); 
    instream >> number; 
    for (int i=0;i<rot;i++){number *= 2;} 
    std::stringstream outstream; 
    outstream << number; 
    return outstream.str(); 
} 

...有一个小的修改也让负面的变化。

+0

也许提及修改以允许64位数字。这是问题的一部分。 –

+0

@Ben thx,没有注意到一个 – user463035818