C语言编程题:移位函数,既能循环左移又能循环右移
编写一个移位函数,使移位函数既能循环左移又能循环右移。参数n大于0时便是左移,参数n小于0时便是右移。目前只学到函数,位运算,后面的只是尽量别用。老师给的答案:unsig...
编写一个移位函数,使移位函数既能循环左移又能循环右移。参数n大于0时便是左移,参数n小于0时便是右移。
目前只学到函数,位运算,后面的只是尽量别用。
老师给的答案:
unsigned move(unsigned value, int n)
{
unsigned z;
if (n > 0) {
// 循环左移
z = (value >> (32 - n)) |(value << n);
}else
{
// 循环右移
n = -n;
z = (value << (32 - n)) |(value >> n);
}
return z;
}
int main(int argc, const char * argv[])
{
unsigned a;
int n;
printf("请输入一个八进制输:\n");
scanf("%d", &a);
printf("请输入要移位的位数:\n");
scanf("%d", &n);
printf("移位后的结果是:%o\n", move(a, n));
return 0;}
屌丝表示看不懂,求大神解释,带注释最好! 展开
目前只学到函数,位运算,后面的只是尽量别用。
老师给的答案:
unsigned move(unsigned value, int n)
{
unsigned z;
if (n > 0) {
// 循环左移
z = (value >> (32 - n)) |(value << n);
}else
{
// 循环右移
n = -n;
z = (value << (32 - n)) |(value >> n);
}
return z;
}
int main(int argc, const char * argv[])
{
unsigned a;
int n;
printf("请输入一个八进制输:\n");
scanf("%d", &a);
printf("请输入要移位的位数:\n");
scanf("%d", &n);
printf("移位后的结果是:%o\n", move(a, n));
return 0;}
屌丝表示看不懂,求大神解释,带注释最好! 展开
2个回答
展开全部
#include <stdio.h>
#include <math.h>
unsigned fun(unsigned num, int n)
{
if(n > 0)
{
//sizeof(unsigned)*8计算变量所占位数,如int型占32位
return (num >> (sizeof(unsigned)*8 - n)) | (num << n); //先高位移动,再低位移动后,两者按位或,相当把低位溢出的又添加到了高位,实现了循环的效果
}
else
{
return (num << (sizeof(unsigned)*8 - abs(n))) | (num >> abs(n));
}
}
void main(void)
{
printf("%u\n", fun(2, -34));
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询