为了账号安全,请及时绑定邮箱和手机立即绑定

我用一些10010或者什么试验得不出想要的结果,我反复看发现这句我还是无法理解啊!

我用一些10010或者什么试验得不出想要的结果,我反复看发现这句我还是无法理解啊!

C
子衿沉夜 2023-04-20 19:15:10
函数getbits(x, p, n),它用于返回x从p位置开始的(右对齐的) n位的值。假定第0位是最右边的一位, n与p都是符合情理的正值。例如,getbits(x, 4, 3)返回右对齐的第4、3、2共三位:/* getbits:取从第p位开始的n位*/unsigned getbits(unsigned x, int p, int n){return (x >> (p+1-n) ) & ~(~ 0 << n);}其中的表达式x >> (p+1-n) 将所希望的位段移到字的右边。~ 0 将所有位都置为1,~ 0 << n将(~) 0左移n位,将最右边的n位用0填空。再对这个表达式求反,将最右边n位置为1,其余各位置为0。 表达式x >> (p+1-n) 将所希望的位段移到字的右边】这句什么意思?
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

二进制的最低位也就是最右边叫做第零位

原书中写的“从右边数第p位开始向右边n位的字段”容易让人产生误解

但是函数前那段中写的“返回x中第p位开始的n位”是正确的,返回第4,3,2位也是正确


这里以 x = 10 作为举例,运算过程如下返回x中从右边数第p位开始向右数n位的字段getbits(10, 4, 3) = 2 10  0000 0000 0000 1010 | >>p 0000 0000 0000 0000 | 1010>>1 0000 0000 0000 0000 | 0101 0<<n 0000 0000 0000 0010 | 10 ~0  1111 1111 1111 1111 |<<n 1111 1111 1111 1000 |~   0000 0000 0000 0111 | &   0000 0000 0000 0010 -> 2


查看完整回答
反对 回复 2023-04-23
?
桃花长相依

TA贡献1860条经验 获得超8个赞

是对的啊
getbits(x,4,3)
= x>>2 & 0x7

查看完整回答
反对 回复 2023-04-23
  • 2 回答
  • 0 关注
  • 156 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信