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;
}