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

如何在c中向左旋转所有位,向右旋转最后一位,c,bit-manipulation,bit,C,Bit Manipulation,Bit,我必须将所有位从x1位置移到左边,将左边的第一位移到位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: %08

我必须将所有位从x1位置移到左边,将左边的第一位移到位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;
}
introtateleft(intx);
int main()
{      
int getal,结果;
printf(“输入一个数字:\n”);
scanf(“%i”和“getal”);
结果=旋转英尺(getal);
printf(“旋转后的结果:%08x”,结果);
返回0;
}
int rotateleft(int x)
{
int rbit;

rbit=x在执行移位之前,获取顶部位并保存它。然后在移位之后,将保存的位设置为(移位)值的最低位。

方法是使用
掩码
来过滤最左边的位[通常是MSB]然后应用required
shift
并将存储的位放回最右边的位位置[通常为LSB]移位值

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

unsigned int rotl(unsigned int value,int shift){
返回(值>(sizeof(值)*字符位移位));
}
introtateleft(intx)
{
int rbit;
整数位;

位=!!(x&(1将数字向左移动1,然后使用按位或将最后一位添加到新数字的开头:

10000000000010010110100001100010 // i

00000000000100101101000011000100 // i << 1
00000000000000000000000000000001 // i >> 31
           |  | || |    ||   | |
00000000000100101101000011000101 // (i << 1) | (i >> 31)
10000000000010010110100001100010//i
00000000000100101101000011100100//i>31
|  | || |    ||   | |
00000000000100101101000011100101/(i>31)
因此,您的功能将是:

unsigned int rotateLeft(unsigned int i)
{
无符号整数j=(i>31);
返回j;
}
#包括
#包括
#包括
uint16\u t旋转(uint16\u t num,uint16\u t shBits);
内部主(空)
{   
uint16_t num=0x0088,分辨率;
printf(“%x\n”,num);
res=旋转(num,3);
printf(“%x\n”,res);
返回0;
}
uint16\u t旋转(uint16\u t num,uint16\u t shBits)
{
shBits=((shBits<0)?-shBits:shBits);//确保n不是负数
shBits=shBits%16;//确保移位值小于32
//将shBits最高有效位向右移动(LSB)
//0x0088>>(16-3)=>0000 0100
//位=0000 0100
uint16_t bits=num>>(16位);
//(num=0x0088)>>3=>0x0011
num>>=shBits;
printf(“num%x\n”,num);
printf(“位%x\n”,位);

你的意思是:你想旋转吗?旋转中没有循环移位C@joop是的,我的意思是轮换,因为你忘了在轮换中添加返回打点@ನಿಶಿತ್ 如果有的话,这个问题会比现在更糟。这假设
char
是8位。使用
char\u-BIT
而不是8位。你可以使用
char\u-BIT
来代替。
char
根据C标准必须至少有8位宽,所以我想这是相当安全的。如果
I
是负数呢?很有趣,不是维恩意识到了这一点。那么,用质疑的形式也没什么用,所以这里有一种不太礼貌的形式:伙计,那是UB。@harold为什么是UB?因为,不幸的是,标准上说的是关于左移:“如果E1有一个有符号类型和非负值,并且E1×2E2在结果类型中是可表示的,那么这就是结果值;否则,行为是未定义的。”还要注意,右移位有符号整数是实现定义的,很可能是算术移位。所以我应该使用无符号整数而不是整数?
int rotateleft (int x)
{
    int rbit;
    int bit;
    bit = !!(x & (1 << 31));
    x = x <<1;
    x |= bit;
    return x;
}
10000000000010010110100001100010 // i

00000000000100101101000011000100 // i << 1
00000000000000000000000000000001 // i >> 31
           |  | || |    ||   | |
00000000000100101101000011000101 // (i << 1) | (i >> 31)
unsigned int rotateLeft(unsigned int i)
{
    unsigned int j = (i << 1) | (i >> 31);
    return j;
}
#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); 
}