1.x = y 返回值为x, 如while(x = 1) 这个语句会一直循环
2.if判断if(x < y < z)错误的原因,只要z>1上述表达式恒成立
3.位运算符: if(n&(n-1) == 0)判断n的二进制表示是否仅有一位为1
两个两同的数异或后结果为0,这一性质常用来寻找数成对出现时缺失的某一个数
不用运算符实现两个数的加法:
int add_no_rithm(int a, int b) { if(b == 0) return a; int sum = a ^ b;//当前位置值 int carry = (a & b) << 1;//当前向前的进位 return add_no_rithm(sum, carry); }
4.统计n转化成二进制后包含1的数量
int count(int a) { int n = 0; while(a != 0) { a &= ( a - 1); n++; } return n; }
5.
int main(int argc, const char *argv[]) { unsigned int a = 0x1ffffff7; unsigned char b = a; char c = a; char *p = (char*)&a; printf(" %x %x %x\n", b, c, *p); return 0; }
输出:f7 fffffff7 fffffff7
分析:printf将b c入栈时,需要入栈4个字节(%x是16进制证书格式输出),需要做符号位扩展,b的高位补0,c的高位补1
6.printf("%d", a+++b+c+++d)--->++优先级大于+ -->a+b+c+d (a= a+1, c = c+1)
7.float与0值得比较:if(fabx(a) < 1e-6) if(a > -1e-6 && a < 1e-6)
8.一个整型数组除了两个数字外,其他数字都出现2次,找出这两个只出现一次的数字,时间复杂度O(n),空间复杂度O(1)
1 .全部数组元素异或,最后结果为那两个数异或的结果
2.找到异或结果中出现第一个1的位置,根据这个位置将数组元素分为2部分,每部分含一个只出现一次的元素
void find(int *arr, int n) { if(n < 2) return; int result = 0; int i; for(i = 0; i < n; ++i) result ^= arr[i]; unsigned int index = findfirst1(result); int num1 = 0; int num2 = 0; for(i = 0; i < n; ++i) { if(isbit1(arr[i], index)) num1 ^= arr[i]; else num2 ^= arr[i]; } printf("%d %d\n", num1, num2); } unsigned int findfirst1(int num) { unsigned int indexbit = 0; while( (num & 1) == 0 && indexbit <32 ) { num >>= 1; indexbit++; } return indexbit; } bool isbit1(int num, unsigned int index) { return ( num & (1 << index) ); }