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