首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >k&r练习2-6“setbit”

k&r练习2-6“setbit”
EN

Stack Overflow用户
提问于 2016-06-10 00:51:52
回答 1查看 577关注 0票数 0

我在这里看到了答案:6

我已经测试了第一个,但在这部分:

代码语言:javascript
复制
x = 29638;
y = 999;
p = 10;
n = 8;

return (x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n)))))

在一篇论文中它给了我一个6,但在程序中它返回28678.

在本部分:

代码语言:javascript
复制
 111001111000110
&000100000000111

结果,最左边的三位必须类似于x中的1,但按位运算符&说:

如果所有操作数的对应位数为1,则按位数的输出为1。如果操作数的任一位为0,则对应位的结果被求为0。

那么,为什么它返回的数字等于1的3位呢?

EN

回答 1

Stack Overflow用户

发布于 2016-06-10 02:10:16

我们开始,一步一步(使用16位数字)。我们首先:

代码语言:javascript
复制
(x & ((~0 << (p + 1)) | (~(~0 << (p + 1 - n)))))

以数字代替(以小数表示):

代码语言:javascript
复制
(29638 & ((~0 << (10 + 1)) | (~(~0 << (10 + 1 - 8)))))

加起来的位移位量给出:

代码语言:javascript
复制
(29638 & ((~0 << 11) | (~(~0 << 3))))

将数字重写为二进制并应用~0s.

代码语言:javascript
复制
(0111001111000110 & ((1111111111111111 << 1011) | (~(1111111111111111 << 0011))))

在完成轮班之后,我们得到:

代码语言:javascript
复制
(0111001111000110 & (1111100000000000 | (~ 1111111111111000)))

应用其他按位-不(~):

代码语言:javascript
复制
(0111001111000110 & (1111100000000000 | 0000000000000111))

和按位-OR (|):

代码语言:javascript
复制
0111001111000110 & 1111100000000111

最后,按位-和(&):

代码语言:javascript
复制
0111000000000110

所以我们有二进制0111000000000110,它是2 + 4 + 4096 + 8192 + 16384,也就是28678

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37738387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档