随笔 - 43  文章 - 0  评论 - 17  阅读 - 10749

20135220谈愈敏-第二章家庭作业

第二章家庭作业

2.59

题目要求:编写一个C表达式,生成一个字,由x的最低有效字节和y中剩下的字节组成。

思想:首先取出x的最低有效字节,采用 x & 0xFF 的方法,取出y的剩下字节采用 y & ~0xFF 的方法,这里都是运用到了与1相与是本身,与0相与是0的思想。

然后考虑到与0相或是本身,把这两部分相或就能得到结果。

具体代码与实践:

2.60

题目要求:将字节从低(0)到高编号,写出函数实现将参数x的字节i被替换成字节b。

思想:首先思考如果要替换,先将x的字节i变成0,把字节b通过相或的办法“装”到相应位置即可。

将0xFF向左移到对应x的字节i的位置取反后&x就能把字节i变成0,那要左移多少位呢?i字节对应8*i位,即i<<3位,所以第一步是 x & ~(0xFF << (i<<3))。为了能够把b“装”到正确位置,要左移相同的位数,即 b << (i<<3)。最后把这两部分相或即可。

具体代码与实践:

2.61

题目要求:编写一个C表达式,下述条件中产生1,其他情况为0。

A:x的任何位都等于1

思想:为了保证任何位都是1的情况下才输出1,可以先按位取反 ,这样任何位都应该是0,然后运用逻辑运算就可以产生1。

具体代码与实践:

B:x的任何位都等于0

思想:为了保证任何位都是0(数值为0)的情况下才输出1,直接运用逻辑运算就可以产生1,只要有一位不是0,这个数值就不是0,逻辑运算后自然会是0.

具体代码与实践:

C:x的最高有效字节中的位都等于1

思想:联系A中的情况,只要把这里的x的最高字节替换A中的x即可,是相似的原理。

那如何取出最高有效字节呢?这里又可以联系2.60中的方法,主体是将x右移得到,那右移多少位呢?计算除最高有效字节以外有多少位:(sizeof(int)-1) << 3

最后套用A中的公式就是:! ~ (x >> ( (sizeof(int)-1) << 3 )

具体代码与实践:

D:x的最低有效字节中的位都等于0

思想:联系B中的情况,只要把这里的x的最低字节替换B中的x即可,是相似的原理。

获取x的最低字节比较简单:x & 0xFF

最后套用B中的公式就是:! (x & 0xFF)

具体代码与实践:

[问题]多数代码中,scanf函数里用了%p,实现从屏幕直接输入一个16进制的数,这样编译会有一个警告,因为和我定义的数据类型不同,可是依然能够运行,我认为程序运行时,内部数据可以自己转换过来的。如果我用%d,输入10进制的数就不会有这样的问题。

posted on   20135220谈愈敏  阅读(268)  评论(0编辑  收藏  举报
编辑推荐:
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
阅读排行:
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· ShadowSql之.net sql拼写神器
· Excel百万数据如何快速导入?
· 无需WebView,Vue也能开发跨平台桌面应用
< 2025年4月 >
30 31 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 1 2 3
4 5 6 7 8 9 10

点击右上角即可分享
微信分享提示