为什么宏定义要使用16进制呢

如:

复制代码

#define    SDL_INIT_TIMER        0x00000001
#define SDL_INIT_AUDIO        0x00000010
#define SDL_INIT_VIDEO        0x00000020
#define SDL_INIT_CDROM        0x00000100
#define SDL_INIT_JOYSTICK    0x00000200
#define SDL_INIT_NOPARACHUTE    0x00100000    /**< Don't catch fatal signals */
#define SDL_INIT_EVENTTHREAD    0x01000000    /**< Not supported on all OS's */
#define SDL_INIT_EVERYTHING    0x0000FFFF

复制代码

答案可能有狠多种、主要原因莪认为是16进制比较方便转换成二进制、因为c语言非常多的数据运行需要使用位运算、位运算就必然就是要转化成二进制了、那么为什么不直接用二进制呢、估计原因是二进制书写太容易出错了、而且又长、按十六进制和二进制来说、可以一一按位转换、

10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111

总得来说16位转化成2进制位相当的简单、只要通过查表就可以得到了、每个十六进制的一位数代表4位二进制数、迩只要记住上面的这个表、任何16进制都狠轻松得到二进制、而不用去整什么乘除法取余的垃圾问题、那些是十进制转二进制的产物、比如

0x4EF  ->  0100 1110 1111

0x4C5596 ->  0100 1100 0101 0101 1001 0110

非常的简单吧、只要记得查表就可以了、简直就像对数查表一样、把乘法转化成加法再查表、哈哈、节省了不少脑细胞、可是这个比对数还好、对数取得的值还是近似值 、这个可是精确值哦

 

 其中十六进制最经常用的一种场景便是表示状态、比如以上有八种属性、如果迩使用8个int、每个int表示一种状态、那又太浪费了、在32位的机器上一个int可是32位啊、每种状态无非就是开和关、何必呢!1位足以、不是0就是1、如果迩使用bool来表示、虽然是一位、不过判断起来又过于烦琐、当莪想知道整体8种属性哪些开了哪些关了、得一个一个的去条件if来检测、未免太繁琐了、如果是只存储一个数字里面、用二进制表示、不是一目了然了么、如

00110111

如果例子的属性和上面的例子从左到右对应的话、只要查看这个状态值的二进制表示就一目了然了、这里把SDL_INIT_TIMER和SDL_INIT_AUDIO和SDL_INIT_JOYSTICK都关闭了、哈哈、是不是非常的简单、所以定义这8种属性时、其实只需要记4个16进制数就可以了、它们分别是1、2、4、8、因为转换成二进制刚好是0001、0010、0100、1000、刚好一位十六进制数可以表示四种状态、所以通常宏定义的状态只需要使用这四个数字就可以了、比如0x0001、0x0011、0x0081、都ok、像前面的例子、就只使用了1和2两个十六进制数、最好不要使用其它的十六进制数、一来会把每位十六进制的属性表示状态范围缩小、二来不好判断了、但无论什么时候、迩如果想把全部开关都打开、只要0xFFFF就可以了

参考文章:

http://topic.csdn.net/u/20100224/23/ba39fc77-ce1e-4b8e-a577-7cfc7cc38442.html

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值