免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cviolet
打印 上一主题 下一主题

请高手解惑(谭浩强书中的习题及给出的答案不太理解) [复制链接]

论坛徽章:
0
51 [报告]
发表于 2007-07-22 22:53 |只看该作者

今天我又发现一个问题

就是谭老师的配套答案书 谭主编有关位操作之 >>
先测试编译系统为是否为算术右移,如是,写实现逻辑右移的函数为
unsigned getbits2(unsigned value ,int n)
(unsigned z;
z=(~(1>>n)&(value>>n));
return (z);
}
我觉得写得真可笑,既然 value 是无符号位了,管它是什么编译器,
用得着这么复杂吗? z=value>>n;return z;不就行了?

论坛徽章:
0
52 [报告]
发表于 2007-07-22 22:57 |只看该作者
原帖由 zllfdd 于 2007-7-22 08:52 发表
大家一提起国内C方面的书就想到谭的书,这说明这本书大多数人都知道。我们学C的时候用的也是这本书,只是之前看过另处一本书,再看谭的书就觉得很是难受。大学的书大部分都留下了,这本书别人要就送人了。
现在 ...

之前看过另处一本书      打五笔的,终于发现一个同类。呵。。。。。。

论坛徽章:
0
53 [报告]
发表于 2007-07-23 07:39 |只看该作者
我觉得这书一定要看,但不能像学数学一样什么都研究,反正那些什么++---+--++--++这样的运算就直接过,学会也没意思,没人能保证这样的代码在所有编译器上结果都一样,但是这本书一定要看,大家都说他的书好,用来初学是很不错的选择,不过不需要在这些问题上反复钻研,没意思,我自己宁愿多写几行,多打几个括号,也不愿意写这些代码,一般一排代码不代括号的话,就一个操作最好(我自己的风格^_^)

论坛徽章:
0
54 [报告]
发表于 2007-07-23 07:40 |只看该作者
原帖由 baohuaihuai 于 2007-7-21 23:18 发表
用一个字形容这本书....圡

我看不到,阿,是个框框,里面写着5721...........

论坛徽章:
0
55 [报告]
发表于 2007-07-23 09:34 |只看该作者
不要太挑剔了。不过就是个教材而已。

一个写那么多计算机语言教材的教师,不可能对C有多么熟悉和掌握。也不排除许多内容是找学生写的。

因为写了那么多语言教材,所以C的写法更似乎受BASIC,FORTRAN, PASSCAL影响。

在CU论坛中,一定有几十位上百位熟悉C的网友比作者水平高,而且还不是高一点。

没有什么奇怪的。学完后,如果觉得不好,可以在换一个看。

论坛徽章:
0
56 [报告]
发表于 2007-07-23 09:39 |只看该作者

回复 #1 cviolet 的帖子

谭老的程序没有错,只是有些局限,还有楼主对程序分析有点不妥。

main()
{ unsigned int a;
  unsigned int getbits(unsigned);
  printf("\n Input an octal number:");
  scanf("%o",&a);
  printf("result:%o\n",getbits(a));
}
unsigned int getbits(unsigned value) 编译器只会检查带入的value是不是unsigned类型并不检查其大小为char,int还是long.

{ unsigned int z;   z确定是一个unsigned int类型,
z=value&0100000;
上个语句确定要把value转换成unsigned int类型,
0100000是一个八进制数,其十六进制为0x8000,二进制为1000,0000,0000,0000
可见编译器支持的unsigned int是16位的,
当然还有你输入的数不能大于2^16=65536.
  if (z==0100000)
     z=~value+1;
  else
     z=value;
  return(z);
}

论坛徽章:
0
57 [报告]
发表于 2007-07-23 09:42 |只看该作者
else
      b=~(-a)+1;//负数 绝对值之 按位取反 加1


a小于0 ,-a是正数,负数的补码是~(-a)+1
没什么问题。

[ 本帖最后由 ATmega32 于 2007-7-23 09:46 编辑 ]

论坛徽章:
0
58 [报告]
发表于 2007-07-23 10:53 |只看该作者
原帖由 ATmega32 于 2007-7-23 09:42 发表
else
      b=~(-a)+1;//负数 绝对值之 按位取反 加1


a小于0 ,-a是正数,负数的补码是~(-a)+1
没什么问题。

我自已写的我可以自信的说确实是没有问题,我质疑的是 谭老师写的,所以才贴之求解惑。

论坛徽章:
0
59 [报告]
发表于 2007-07-23 11:04 |只看该作者

回复 #50 cviolet 的帖子

"先测试编译系统为是否为算术右移,如是,写实现逻辑右移的函数为
unsigned getbits2(unsigned value ,int n)
(unsigned z;
z=(~(1>>n)&(value>>n));
return (z);
}
我觉得写得真可笑,既然 value 是无符号位了,管它是什么编译器,
用得着这么复杂吗? z=value>>n;return z;不就行了?
"


value是unsigned类型,你能确定它的最高位是0是1? ">>"操作各个编译器在不同处理器和不同位数处理器上不同大小的数实现会相同吗?
楼主不要嘲笑别人才是。

论坛徽章:
0
60 [报告]
发表于 2007-07-23 11:15 |只看该作者
原帖由 zt52952 于 2007-7-23 11:04 发表 value是unsigned类型,你能确定它的最高位是0是1? ">>"操作各个编译器在不同处理器和不同位数处理器上不同大小的数实现会相同吗?
楼主不要嘲笑别人才是。

已经unsigned了,它是0是1又有什么关系呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP