1、~ 按位取反
& 按位与
| 按位或
^ 按位异或
2、结合律 a&b&c <=> (a&b)&c <=> a&(b&c)
交换律 a&b b&a
3、左移和右移注意点
·左移运算符<< 将运算符的二进制位左移
·规则:高位丢弃,低位补0
·右移运算符>> 把运算符的二进制位右移
·规则:高位补符号位,低位丢弃
4、防错准则:
·避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中
·当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达计算次序
5、左移n位相当于乘以2的n次方,但效率比数学运算符高
右移n位相当于除以2的n次方,但效率比数学运算符高
6、交换两个数的三种方法
任意类型都可以
#define SWAP1(a,b) \
{ \
int temp = a; \
a = b; \
b = temp; \
}
第二种方法如果a很大或者b很大,就会溢出
#define SWAP2(a,b) \
{ \
a = a + b; \
b = a - b; \
a = a - b; \
}
使用领域int型
#define SWAP3(a,b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}
7、面试题详解:
有一个数列,其中的自然数都是以偶数次数的形式出现,只有一个自然数出现的次数是奇数,
编写程序找出这个数
#include <stdio.h>
#define DIM(a) (sizeof(a)/sizeof(*a))
int main()
{
int a[] = {2,3,5,7,2,2,2,5,3,7,1,1,1};
int find = 0;
int i = 0;
for (i = 0; i < DIM(a); i++)
{
find = find ^ a[i];
}
printf ("find = %d\n", find);
return 0;
}
& 按位与
| 按位或
^ 按位异或
2、结合律 a&b&c <=> (a&b)&c <=> a&(b&c)
交换律 a&b b&a
3、左移和右移注意点
·左移运算符<< 将运算符的二进制位左移
·规则:高位丢弃,低位补0
·右移运算符>> 把运算符的二进制位右移
·规则:高位补符号位,低位丢弃
4、防错准则:
·避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中
·当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用括号()来表达计算次序
5、左移n位相当于乘以2的n次方,但效率比数学运算符高
右移n位相当于除以2的n次方,但效率比数学运算符高
6、交换两个数的三种方法
任意类型都可以
#define SWAP1(a,b) \
{ \
int temp = a; \
a = b; \
b = temp; \
}
第二种方法如果a很大或者b很大,就会溢出
#define SWAP2(a,b) \
{ \
a = a + b; \
b = a - b; \
a = a - b; \
}
使用领域int型
#define SWAP3(a,b) \
{ \
a = a ^ b; \
b = a ^ b; \
a = a ^ b; \
}
7、面试题详解:
有一个数列,其中的自然数都是以偶数次数的形式出现,只有一个自然数出现的次数是奇数,
编写程序找出这个数
#include <stdio.h>
#define DIM(a) (sizeof(a)/sizeof(*a))
int main()
{
int a[] = {2,3,5,7,2,2,2,5,3,7,1,1,1};
int find = 0;
int i = 0;
for (i = 0; i < DIM(a); i++)
{
find = find ^ a[i];
}
printf ("find = %d\n", find);
return 0;
}