定义一个宏,比较a和b的大小,不用大于,小于,if语句

I ate my words,嘿嘿,由于最近接了英语老师的翻译的任务,有点乱,所以把空闲时间有时候给了翻译,没有每天看算法。坚持吧,俞敏洪都说了,如果每天背十个单词,一年就是3560个单词呢,你也是大师级人物了,嘿嘿,所以坚持吧。。。

 

今天在网上搜了一个百度题,定义一个宏,比较a和b的大小,不准用大于、小于、if语句

 

对于这个问题,貌似可以想到好多我接触过但是拿不准的定义,比如宏,当初学C时只对定义一个数的宏有印象(盲点吧),还有这个题用到的二进制的按位与运算,也不是很懂的,32位二进制表示成16进制。。。好多拿不准的地方。

 

下面是这个题的解法:

define max(a,b)  (((long)(a-b)) & 0x80000000)?b:a

 

关于宏定义的问题,鉴于内容貌似挺多(啊,以前学C的时候学的多么的皮毛啊),还是再写一篇文章吧。

 

其中按位与操作规则是

0&0=0

0&1=0

1&0=0

1&1=1

 

这个16进制的数0x80000000,是32位的数据,因为一个十六进制数是4位二进制数嘛

 比如0x8的2进制是:1000.

0x80000000 的二进制是:1000 0000 0000 0000 0000 0000 0000 0000

1后面31个0。有点不明白的是为什么是负数??? (这里应该是计算机基本组成原理讲的,只怪我又犯毛病了,上课只听懂,但是没深入,所以再想起来就是没有那么理解了,一会再看看吧)

 

如果a-b是正数,那根据二进制数的表示, 分为符号位跟数值位,0正1负,所以a-b的最高位是0,那么与上100000.。。。。之后呢,结果是0啦嘿嘿。。。

如果a-b是负数,那最高位是1,与上10000.。。。之后结果是1啦嘿嘿。。。

 

哎,明天要考操作系统啦,所以,先复习下操作系统,然后再整理二进制数的表示跟宏定义的部分吧。。。 

你可能感兴趣的:(数据结构与算法)