為什麼巨集定義要使用16進製制呢

2022-05-11 20:06:05 字數 1712 閱讀 9846

如:

#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來檢測、未免太繁瑣了、如果是只儲存乙個數字裡面、用二進位制表示、不是一目了然了麼、如00

1101

11如果例子的屬性和上面的例子從左到右對應的話、只要檢視這個狀態值的二進位制表示就一目了然了、這裡把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就可以了

為什麼要使用volatile修飾呢?

1.禁止指令重排序 建立物件要經過如下幾個步驟 a.分配記憶體空間 b.呼叫構造器,初始化例項 c.返回位址給引用 但是jvm具有指令重排的特性,執行的順序有可能變成 a c b,指令重排在單執行緒下不會出現問題,但是在多執行緒下會導致乙個執行緒獲得還沒有初始化的例項。例如 執行緒t1執行了a,b,...

巨集定義為什麼要使用do while 0 形式

如果你是一名c程式設計師,你肯定很熟悉巨集,它們非常強大,如果正確使用可以讓你的工作事半功倍。然而,如果你在定義巨集時很隨意沒有認真檢查,那麼它們可能使你發狂,浪費n多時間。在很多的c程式中,你可能會看到許多看起來不是那麼直接的較特殊的巨集定義。下面就是乙個例子 1 2 define set tas...

為什麼在定義hashcode時要使用31這個數呢?

public int hashcode hash h return h 該函式是我看的函式介面原始碼,為什麼要使用31這個數呢?其實上面的實現也可以總結成數數裡面下面這樣的公式 s 0 31 n 1 s 1 31 n 2 s n 1 原因如下 a.31是乙個素數,素數作用就是如果我用乙個數字來乘以這...