十六进制、二进制及十进制数的区别使用理解
十六进制      二进制
0x01        00000001
0x02        00000010
0x04        00000100
0x08        00001000
0x10        00010000
0x20        00100000
0x40        01000000
0x80        10000000
没什么特别的东西,就是两个字:整齐,二进制表示太长了,还难得搞清各位是零还是一
十六进制    十进制
0x04000000 67108864
0x08000000 134217728
0x10000000 268435456
0x20000000 536870912
0x40000000 1073741824
0x80000000 2147483648
十进制你一看是个莫名其妙的数,十六进制你一看就清楚2进制是啥,哪一位为1哪一位为0,方便按位操作,比如 |, &
位运算和16进制(其他数制也一样)没关系的。一个数据用16进制表示还是10进制表示,不影响它的值。如果一个数:num
如果某一位为1,比如第3位,那么(num&00000100)就为1,否则为0
所以可以用这个按位与运算来判断某一位是否为1
比如一个数 #define MASK 3967
这样写,读程序的人一头雾水,需要打开计算器看是个什么

如果这么些 #define MASK 0x0F7F
那么读者很容易明白倒数第8个字符为0,其余除了高四位都为1,不用打开计算器看了,二进制的话太长,而且还要数,十六进制不用数,一个字符就是4个二进制位
再看下面的宏:
#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 */
2进制转十进制在线计算器
#define SDL_INIT_EVERYTHING    0x0000FFFF
16进制比较方便转换成二进制、因为c语言非常多的数据运行需要使用位运算、位运算就必然就是要转化成二进制了、那么为什么不直接用二进制呢、估计原因是二进制书写太容易出错了、而且又长、按十六进制和二进制来说、可以一一按位转换、
其中十六进制最经常用的一种场景便是表示状态、比如以上有八种属性、如果迩使用8int、每个int表示一种状态、那又太浪费了、在32位的机器上一个int可是32位啊、每种状态无非就是开和关、何必呢!1位足以、不是0就是1、如果迩使用bool来表示、虽然是一位、不过判断起来又过于烦琐、当莪想知道整体8种属性哪些开了哪些关了、得一个一个的去条件if来检测、未免太繁琐了、如果是只存储一个数字里面、用二进制表示、不是一目了然了么、如
0
0
1
1
0
1
1
1
如果例子的属性和上面的例子从左到右对应的话、只要查看这个状态值的二进制表示就一目了然了、这里把SDL_INIT_TIMERSDL_INIT_AUDIOSDL_INIT_JOYSTICK都关闭了、
哈哈、是不是非常的简单、所以定义这8种属性时、其实只需要记416进制数就可以了、它们分别是1248、因为转换成二进制刚好是0001001001001000、每一位十六进制数对应四种状态(十六进制数一位转换成二进制位四位,每位是01对应一种状态)、所以通常宏定义的状态只需要使用这四个数字就可以了、比如0x00010x00110x0081、都ok、像前面的例子、就只使用了12两个十六进制数、最好不要使用其它的十六进制数、一来会把每位十六进制的属性表示状态范围缩小、二来不好判断了、但无论什么时候、迩如果想把全部开关都打开、只要0xFFFF就可以了
说明:本文是根据网上大神们的文章整理的,觉得不错,编辑整理分享给大家一起学习理解。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。