如何将所有位向左旋转,在c中向右旋转最后一位

时间:2014-01-07 10:39:48

标签: c bit-manipulation bit

我必须将所有位从x 1位置向左移位,将左边的第一位移位到位位置0(最右边)。我想知道我做错了什么,你能不能帮帮我。

int rotateleft (int x);

int main ()
{      
    int getal,result;
    printf("Enter a number :\n");
    scanf("%i",&getal);
    result=rotateleft(getal);
    printf("result after rotation: %08x", result );
    return 0;
}

int rotateleft (int x)
{
    int rbit;
    rbit = x <<1;
return rbit;
}

6 个答案:

答案 0 :(得分:5)

来自wikipedia

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

答案 1 :(得分:2)

在进行换档之前,先取一下并保存。然后在移位后,将保存的位设置为(移位)值中的最低位。

答案 2 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

uint16_t rotate(uint16_t num, uint16_t shBits);


int main(void) 
{   
   uint16_t num = 0x0088, res;
   printf("%x\n", num);
   res =  rotate(num, 3);
   printf("%x\n", res);
    return 0;
}

uint16_t rotate(uint16_t num, uint16_t shBits)
{
    shBits = ( (shBits < 0) ? -shBits : shBits) ; // make sure that n is not a negative number
    shBits = shBits % 16; // ensure that the shift value is less than 32

    // move shBits most significant bits to the right (LSBs)
    // 0x0088 >> (16 - 3) => 0000 0000 0000 0100
    // bits = 0000 0000 0000 0100
    uint16_t  bits = num >> (16 - shBits);

    // (num = 0x0088) >> 3 =>0x0011
    num >>= shBits;

    printf("num %x\n", num);
    printf("Bits %x\n", bits);
    shBits <<= num; // postion the shifted bints to the right location
    num |=shBits;
    printf("num %x\n", num);
    return (num); 
}

输入为0x0088 (0000 0000 1000 1000)3轮播 输出0x0011 (0000 0000 0001 0001)

答案 3 :(得分:0)

这个想法是使用mask来输出最左边的位[通常是MSB]并保存它。然后应用所需的shift并将存储的位放回最右位的[通常为LSB]移位值。

在您的代码中,还有一件事需要注意,return函数中没有int rotateleft (int x)语句。完成所有计算后,您将无法获得输出。添加一个return rbit

答案 4 :(得分:0)

int rotateleft (int x)
{
    int rbit;
    int bit;
    bit = !!(x & (1 << 31));
    x = x <<1;
    x |= bit;
    return x;
}

答案 5 :(得分:0)

将数字向左移1,然后使用按位OR将最后一位添加到新数字的开头:

10000000000010010110100001100010 // i

00000000000100101101000011000100 // i << 1
00000000000000000000000000000001 // i >> 31
           |  | || |    ||   | |
00000000000100101101000011000101 // (i << 1) | (i >> 31)

所以你的功能将是:Live Demo

unsigned int rotateLeft(unsigned int i)
{
    unsigned int j = (i << 1) | (i >> 31);
    return j;
}