写一个函数rightrot(x,n),它返回整数x的值 通过n次操作向右旋转
我无法看到如何获取这些位并将它们放在正确的位置而不需要x的长度(位数)。
我是在想错还是我真的需要以某种方式获得x的长度?如果是这样,我将如何获得这个长度的x?
顺便说一下,下面的代码是错误的,我只是将length_x用于展示我的问题。
我希望有人能指出我正确的方向。
#include <stdio.h>
unsigned rightrot(unsigned x, int n);
main()
{
unsigned x = 75;
int p, n, y;
p = 5;
n = 3;
y = 45;
printf("%u\n",rightrot(x,n));
}
unsigned rightrot(unsigned x, int n)
{
oldn = (x & ~(~0 << n)) << length_x;
x = x >> n | oldn;
return x;
}
答案 0 :(得分:1)
尝试:
unsigned int rrot(unsigned int x, int n) {
int len;
for (len=31;len>=0 && !((1 << len) & x);len--);
len++;
return ((x >> n) | (x << (len - n)) & ((1 << len) - 1);
}
for循环应该找到x
的位长度。它沿着n的位迭代,检查该位是否为高;如果是这样,那就是数字的长度。
注意:不会检查len
是否大于n
。
答案 1 :(得分:0)
由于看起来这可能是一个家庭作业问题,让我给你一个提示,而不是完整的答案。
是的,您可以在不明确使用变量大小的情况下执行此操作。您可以执行rightrot(x,n)
n次rightrot(x,1)
。现在,如果没有可变大小,你如何做rightrot(x,1)
? x
最右边的位只有两种可能:0和1.你可以单独处理它们。
答案 2 :(得分:0)
int nlz(unsigned x);
// 75 : 1001011 -> 3 bit shift right -> 57 : 111001
unsigned rightrot(unsigned x, int n){
int length_x = 32 - nlz(x);//32 : unsigned int is assumed to be a 32-bit
unsigned mask = (1 << length_x) - 1;
return (x >> n) | mask & (x << (length_x - n));
}
//count zero bit from left
int nlz(unsigned x) {
int y, m, n;
y = - (x >> 16);
m = (y >> 16) & 16;
n = 16 - m;
x = x >> m;
y = x - 0x100;
m = (y >> 16) & 8;
n = n + m;
x = x << m;
y = x - 0x1000;
m = (y >> 16) & 4;
n = n + m;
x = x << m;
y = x - 0x4000;
m = (y >> 16) & 2;
n = n + m;
x = x << m;
y = x >> 14;
m = y & ~(y >> 1);
return n + 2 - m;
}
答案 3 :(得分:0)
unsigned rightRot(unsigned x, int n){
unsigned msb_1=~(~(unsigned)0 >> 1);
for(int i=0; i<n; i++){
if(x&1) {x=(x >>1)|msb_1;}
else {x=x>>1;}
}
return x;
}//problem K&R