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