1.基本数据类型的强转
2.指针的强转
指针内存储相同的地址,但会根据指针的类型采取相应的解析方式
3.const 修饰变量
const int a=10;
c++在编译时,a保持常性,会将a全部替换为10
c在编译时,a保持变量的属性,不进行替换
4.位操作
&(与) , ^(异或) , |(或) , ~(取反) , <<(左移) , >>(右移)
这些操作只针对 整型(char , short , int ...)
注:%(取模运算符)也只针对整型数
5. &
与 1相& == 0 则为偶数,否则为奇数 (奇数的二进制位最后一位肯定为1)
任何整数与0相&肯定为0
位&可以把某一位 置为0
6. |
位 | 可以把某一位 置为1
7.^
1). 归零率(任何整型数和自身异或时都为0)
2). 恒等率 (任何整数和0异或都为其本身)
3). 交换律
4). 结合律
5). 自反率 cha^chb^cha == chb
8.不使用中间变量交换两个变量
#include <stdio.h> #include <stdlib.h> int main() { char cha = 12; char chb = 23; cha = cha^chb; chb = cha^chb; //=>cha cha = cha^chb; printf("%d\n", cha); printf("%d\n", chb); system("pause"); return 0; }
分析:
9.找出数组只出现一次的元素
#include <stdio.h> #include <stdlib.h> int main() { int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8 }; int count = sizeof(arr) / sizeof(arr[0]); int tmp = 0; for (int i = 0; i < count; i++) { tmp = arr[i] ^ tmp; } printf("%d\n", tmp); system("pause"); return 0; }
10. 左移<<
<<左移一位,后面添一个0
11. 右移>>
有符号数 >> 右移一位,前面添一个符号位
无符号数 >> 右移一位,前面添一个0
12.左移和右移的应用
将某一位置为0时,可将1左移到此位置,然后取反~,在与该整数相&
#include <stdio.h> #include <stdlib.h> int main() { char ch = 0xaa; // ch => 1010 1010 // 0 // 0000 1000 1左移三次 // 1111 0111 对其取反 // 1010 0010 再与ch相与 ch = ~(1 << 3)&ch; return 0; }
13.计算一个整数的二进制位中有多少个1
#include <stdlib.h> int Get_Bit1(unsigned int x) { int sum = 0; while (x!=0) { if (x & 1 ) { sum++; } x = x >> 1; } return sum; } int main() { int x = 0; int sum = 0; scanf("%d", &x); sum = Get_Bit1(x); printf("sum=%d\n", sum); system("pause"); return 0; }