我必须将所有位从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;
}
答案 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;
}