【C语言】练习2-8
- 题目来源:《The C programming language》中的习题P38
- 练习2-1: 编写一个函数rightrot(x,n),该函数返回将x循环右移(即从最右端移除的位将从最左端移入)n(二进制)位后所得到的值。
第一种解法思路:每次将【x最右端右移1位】与【该位左移到最左端】 进行【或运算】 ,这样进行n次循环即可。
实现代码如下:
#include<stdio.h> void main(){ unsigned rightrot(unsigned x, int n); unsigned a = rightrot(3,1); // 2^31 = 2147483648 printf("%u\n",a); } /*rightrot: rotate x to the right by n position*/ unsigned rightrot(unsigned x, int n) { int wordlength(void); int rbit; /* rightmost bit*/ while(n-- > 0) { rbit = x << (wordlength() - 1); x = x >> 1; x = x | rbit; } return x; } int wordlength(void) { int i; unsigned v = (unsigned) ~0; for(i = 1; (v = v >> 1) > 0; ++i) ; return i; }
第二种解法思路:判断 x 中最右端位是1还是0,是1就进行运算,若是0 ,直接右移即可。
实现代码如下:
#include<stdio.h> void main(){ unsigned rightrot(unsigned x, unsigned n); unsigned a = rightrot(3,1); printf("%u\n",a); } unsigned rightrot(unsigned x, unsigned n) { while (n > 0){ if ((x & 1) == 1){ //如果最右端位为 1,进行运算 x = (x >> 1) | ~(~0U >> 1); }else{ //若是0 ,直接右移即可。 x = (x >> 1); } n--; } return x; }