赞
踩
一.题目:编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。
- <span style="font-size:18px;">#include <stdio.h>
- #include <stdlib.h>
- #include "limits.h"
- #include "float.h"
-
- unsigned setbits(int x,int p,int n,int y)
- {
- return x&~(~(~0<<n)<<(p + 1 - n))| (y & ~(~0 <<n )) << (p + 1 - n);
- }
- int main()
- {
- printf("%u\n",setbits(5,4,3,6));
- int end = getchar();
- return 0;
- }</span>
x &~(~(~0<< n) << (p + 1 -n)) | (y & ~(~0 <<n )) << (p + 1 - n)
二、编写函数invert(x,p,n),将函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位
求反(即1变成0, 0变成1), x的其余各位保持不变.
分析:
(~0<<n) : 1111 1000
~(~0<<n):0000 0111
~(~0<<n)<<(p + 1 - n):000...111...000
异或:
0^0 = 0,
1^0 = 1,
0^1 = 1,
1^1 = 0
所以用【000...111...000】去和x异或,可得到想要的值。
- <span style="font-size:18px;">unsigned int invert(int x,int p,int n)
- {
- return x ^ (~(~0<<n)<<(p + 1 - n));
- }
- </span>
- <span style="font-size:18px;">int wordlength(void)
- {
- int i;
- unsigned v = (unsigned) ~0;
-
-
- for(i = 1; (v = v >> 1) > 0; ++i)
- ;
- return i;
- }
- unsigned int rightrot(int x,int n)
- {
- int ret;
- while(n-- > 0)
- {
- int rBit = (x & 1) << wordlength() - 1;
- ret = x>>1 | rBit;
- }
- return ret;
- }</span>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。