標籤:style blog io ar color os 使用 sp on
1.進位轉換
1).10進位轉為N進位.方法:(連除倒取餘).
2).N進位轉換為10進位.方法:(按權求和法):當前位上的數乘以基數的位元減1次方.
例:
0b1111 ---- 1* 2^3 + 1*2^2 +1 * 2^1 +1*2^0 = 15;
038 ----- 3*16^1 +8*16^0 = 56;
3).N進位轉換N進位.
例如: 二進位 --- 16進位
1010 0011 ---- A 3
1111 0011 ---- F 3
int a = 010;//8進位 int b = 0x10;//16進位 printf("%d\n", a); printf("%d\n", b); /** 如何輸出進位數: %d ------ 十進位 %0x ------ 十六進位 %o ---- 八進位 */
2.位元運算符
//按位與 & int a = 5 & 7;//5 101 7 111 同為1,則為1.否則為0 .,常用來給某一位做清零操作. printf("%d\n", a);//101 //按位或 | int b = 5 | 7;// 101 111 同為0,則為0,否則為1.,,常用來保留某一位狀態. printf("%d\n", b);//111 //按位異或 ^ int c = 5 ^ 7; printf("%d\n",c);//101 111 010 ,相同為0,不同為1 //按位非 ~ char d = ~ 7;//每一位都做取反操作. printf("%d\n", d); //7 111 -1000 -8 //負數補碼運算: 絕對值取反 加1 符號位 1 相當於 - 0 相當於 + //如果是一個有符號的數,則二進位最高位代表符號位,1 代表負數,0代表正數. //資料在記憶體中儲存時是以補碼的形式儲存,正數的補碼是正數本身,負數的補碼是絕對值取反加一. //一個位元組代表八位位元. /** * 資料類型的取值範圍: * 無符號: * char 0 ~ 2^8 - 1 //0 - 255 * short 0 ~ 2^16 -1 * int 0 ~ 2^32 - 1 * 有符號: * char 11111111有符號,最高位是符號位, - 2^7 ~2^7 - 1 -128 - 127(正數包括0,即128) * short - 2^15 ~ 2^15 - 1 * int - 2^31 ~ 2^31 - 1 */ char f = 255;//11111111 絕對值01111111 取反 100000000 加1 100000001 即 -1,負數是按照補碼儲存的 printf("%d\n", f);//-1 unsigned char e = 255; printf("%d\n",e);//超出範圍溢出,即為0 //左移 << unsigned char g = 1; printf("%d\n",g << 3);//乘以2的3次方 // 8 //右移 >> printf("%d\n",255 >> 2);//除於2的2次方 //63例題:
1.將100高四位與第四位互換.100: 0110 0100
unsigned char number = 0b01100100; //1.左移動四位 unsigned char left = number << 4;//01000000 //2.右移動四位 unsigned char right = number >> 4;//00000110 //3.按位或 unsigned char result = left | right;//01000110 printf("%d\n", result);//70
2.將10010010 奇偶位互換
unsigned char num = 0b10010010;//146 //1.向左移動一位,得到奇數位 unsigned char left1 = num << 1; //00100100 ,因為是char型,當向左移動,值=146*2溢出.但換位int型就ok了.char類型範圍,-128 - 127 printf("左移:num = %d,left1 = %d\n", num, left1); //2.保留偶數為,將奇數位清零. 00100000 unsigned char l = left1 & 0b10101010;//奇數位清0,即奇數位為0.&同為1即為1 //3.向右移動一位得到 unsigned char right1 = num >> 1;//01001001 //printf("右移:num = %d,right1 = %d\n", num, right1); //4.保留奇數位,講偶數位清零. 01000001 unsigned char r = right1 & 0b01010101; //5.按位或 unsigned char s = r | l; printf("%d\n", s);
2.兩個數交換,不使用第三個變數(企業級做法)
int m = 10, n = 5; m = m ^ n; n = m ^ n; m = m ^ n; printf("%d %d\n", m, n);
4.棧記憶體配置原則
<span style="color:#000000;">/** * 棧區記憶體配置原則 * 原則: 從高到低分配,從低到高存取. * 地址: 記憶體單元的一個編號 */ //數組名代表數組的首地址,也就是數組中第一個元素的地址.是一個常量地址. int m1[5] = {1, 2, 3, 4, 5}; printf("%p\n", m1); //0x7fff5fbff7f0結果 printf("%p\n", &m1[0]);//0x7fff5fbff7f0 printf("%p\n", &m1[1]);//0x7fff5fbff7f4 printf("%p\n", &m1[2]);//0x7fff5fbff7f8 printf("%p\n", &m1[3]);//0x7fff5fbff7fc printf("%p\n", &m1[4]);//0x7fff5fbff800 //存取,從高到低存取 printf("-------------------------\n"); int x = 5; int y = 10; printf("%p\n",&x);//0x7fff5fbff7b8 printf("%p\n",&y);//0x7fff5fbff7b4,可看出從高到底分配空間 int s1 = - 5;// 1000 0000 0000 0000 0000 0000 0000 0101 按照補碼儲存,絕對值取反加一 printf("%d\n", s1);//1111 1111 1111 1111 1111 1111 1111 1011 FF FF FF FB //斷點 </span>
【學習ios之路:C語言】進位.位元運算.棧