当前位置:   article > 正文

几个典型的按位运算符示例_y x~ 000 , . . .

y x~ 000 , . . .


一.题目:编写一个函数setbits(x, p ,n, y),该函数返回对x执行下列操作后的结果值: 将x中从第p位开始的n个(二进制)位设置为y中最右边n位的值,x的其余各位保持不变。

  1. <span style="font-size:18px;">#include <stdio.h>
  2. #include <stdlib.h>
  3. #include "limits.h"
  4. #include "float.h"
  5. unsigned setbits(int x,int p,int n,int y)
  6. {
  7. return x&~(~(~0<<n)<<(p + 1 - n))| (y & ~(~0 <<n )) << (p + 1 - n);
  8. }
  9. int main()
  10. {
  11. printf("%u\n",setbits(5,4,3,6));
  12. int end = getchar();
  13. return 0;
  14. }</span>


分析:
x的值:xxx...xnnnx...xxx     (n表示需要被替换的n位)
y的值:yy..............ynnn    
题目需要用y中的n位值替换x中的n位值。要实现该功能,需要以下几步:
我们需要对x中n位清零,把y中最右边n位其他以为的位都清零并左移到第p位处,然后进行or操作。
xxx....x000x...xxx |(or操作)
000...  nnn....000     
--------------------------
xxx....xnnnx...xxx  (操作完成,得到想要的值)


步骤分解:
1.对x中n位清零,得到【xxx....x000x...xxx】


a.得到 【111...000...111】这样的结果。一般都用0作为辅助来得到想要的结果。
~0<<n:得到【111......000】
~(~0<<n):得到【000......111】
~(~0<<n)<<(p + 1 - n):得到【000...111...000】
~(~(~0<<n)<<(p + 1 - n)):得到【111...000...111】


b.得到【xxx....x000x...xxx】结果。
上一步步骤a中的结果与【x的值:xxx...xnnnx...xxx】&与运算,得到
xxx...xnnnx...xxx
111....000....111 &
-----------------
xxx...x000x...xxx
总运算:
x &~(~(~0<< n) << (p + 1 -n))


2.对y处理,得到【000...  nnn....000】
~0<<n:得到【111......000】
~(~0<<n):得到【000......0111】
与y相与&,得到【000......0nnn】
移位运算<<(p + 1 - n)),得到:【000...  nnn....000】
总运算:
(y & ~(~0 <<n )) << (p + 1 - n)


3.合并步骤1,2,用与运算:

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异或,可得到想要的值。


  1. <span style="font-size:18px;">unsigned int invert(int x,int p,int n)
  2. {
  3. return x ^ (~(~0<<n)<<(p + 1 - n));
  4. }
  5. </span>



三、编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。
分析:
a.每次将取x最右端的那一位,将该位移到最左端
b.将x向右端移动一位
c.将a得到的值|b得到的值


  1. <span style="font-size:18px;">int wordlength(void)
  2. {
  3. int i;
  4. unsigned v = (unsigned) ~0;
  5. for(i = 1; (v = v >> 1) > 0; ++i)
  6. ;
  7. return i;
  8. }
  9. unsigned int rightrot(int x,int n)
  10. {
  11. int ret;
  12. while(n-- > 0)
  13. {
  14. int rBit = (x & 1) << wordlength() - 1;
  15. ret = x>>1 | rBit;
  16. }
  17. return ret;
  18. }</span>


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/252123
推荐阅读
相关标签
  

闽ICP备14008679号