1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
// 运算符 ~ & | ^ >> << &= |= ^= >>= <<= // 二进制、十进制、十六进制 // 位运算符、位字段 // 字符串累加(int数组合并成字符串) #include <stdio.h> int main(int argc, char const *argv[]) { /* 十进制数 十六进制数 八进制数 二进制等价数 0 0 0 0000 1 1 1 0001 2 2 2 0010 3 3 3 0011 4 4 4 0100 5 5 5 0101 6 6 6 0110 7 7 7 0111 8 8 10 1000 9 9 11 1001 10 A 12 1010 11 B 13 1011 12 C 14 1100 13 D 15 1101 14 E 16 1110 15 F 17 1111 */ //二进制反码或按位取反 ~ ~(10011010)表达式 (01100101)结果值 char val = 2; //00000010 unsigned char newVal = ~val; //11111101 // 输出 253 printf("%d\n", newVal); //位与(AND) & 两个操作数都为1结果才为1 (10010011) & (00111101) = (00010001) //位与赋值运算符 &= val &= 0377 与 val = val & 0377等效 //位或(OR) | 两个操作数任意一个为1结果就为1 (10010011) | (00111101) = (10111111) //位或赋值运算符 |= val |= 0377 与 val = val | 0377等效 //位异或 ^ 两个操作数中只有一个为1结果才为1 (10010011) ^ (00111101) = (10101110) //位异或赋值运算符 ^= val ^= 0377 与 val = val ^ 0377等效 //左移 << 将左侧操作数的值向左移动N位(由右侧操作数指定) 然后丢弃左边移出的操作数 并在右边填充0 //(10001010) << 2 = (00101000) 向左移动2位 第1、2位被丢弃(左边) 末尾填充2个0(右边) //左移动赋值运算符 <<= //右移 >> 将左侧操作数的值向右移动N位(由右侧操作数指定) 然后丢弃右边移出的操作数 //对于unsigned,使用0填充左边空出的位 对于signed,结果依赖于机器 //(10001010) >> 2 = (00100010) | (11100010) 对于无符号肯定是(00100010),有符号根据不同操作系统可能存在不同值 //左移动赋值运算符 >>= //移位运算符能提供快捷、高效(依赖于硬件)对2的幂的乘法和除法 // number << n number乘以2的n次幂 // number >> n 如果number非负,number除以2的n次幂 // 类似于十进制中移动小数点来乘以或者乘以10 return 0; } //移位运算符用于较大的单位中提取多组比特位 #include <stdio.h> #define BYTE_MASK 0xff //对应二进制11111111 int main(int argc, char const *argv[]) { unsigned long color = 0x002a162f; //对应二进制00101010 00010110 00101111 unsigned char blue, green, red; red = color & BYTE_MASK; //001010100001011000101111 & 000000000000000011111111 = 00101111 green = (color >> 8) & BYTE_MASK; //000000000010101000010110 & 000000000000000011111111 = 00010110 blue = (color >> 16) & BYTE_MASK; //000000000000000000101010 & 000000000000000011111111 = 00101010 printf("%d %d %d\n", red, green, blue); //输出对应的10进制为47 22 42 return 0; } // 位字段(bit field)是一个signed int 或 unsigned int中一组相邻的位(C99允许_Bool) #include <stdio.h> struct bit { unsigned int a: 1; unsigned int b: 2; unsigned int c: 3; unsigned int d: 32; } prnt; int main(int argc, char const *argv[]) { // prnt.a的取值范围是0-1 1 // prnt.b的取值范围是0-3 11 // prnt.c的取值范围是0-8 111 // 位长度不能超过32,int的最大长度(4字节*8,具体根据操作系统) prnt.a = 1; prnt.b = 3; prnt.c = 7; // 输出1 3 7 0 (默认0) printf("%d %d %d %d\n", prnt.a, prnt.b, prnt.c, prnt.d); return 0; } // 字符串累加INT数组 #include <stdio.h> #define ARR_SIZE 5 #define TEL_SIZE 11 int main(int argc, char const *argv[]) { int arr[ARR_SIZE] = {8, 2, 1, 0, 3}; int index[TEL_SIZE] = {2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3}; char tel[TEL_SIZE + 1]; int i; for (i = 0; i < TEL_SIZE; ++i) { // + '0'可以将int转为char tel[i] = arr[index[i]] + '0'; } // 结尾勿忘累加'\0' tel[TEL_SIZE] = '\0'; puts(tel); return 0; } |