1.变量名重复,运行结果会如何?
int i=1;
int main()
{
int i=i;
}
结果是i没有初始化!
因为重名,函数外的i根本就无法传入main函数!
2.& |运算符的概念,按位与、按位或。
以上两个运算符针对二进制。对于十进制,会先转换为二进制再进行运算。
3.x&(x-1)实现统计二进制1的个数
这条语句很巧妙。减一运算,每次都会让按位与的结果从尾部减少一个1,即使有一堆0,也会因为借位而实现功能,其时间复杂度是O(n)
而还有一种更加效率的办法,时间复杂度为O(lgN),代码如下。核心思想是按照两位两位的组合来统计1的个数
#include <stdio.h>
int main()
{
unsigned int x = 0xffffffff;
x = (x&0x55555555) + ((x>>1)&0x55555555); //01010101
x = (x&0x33333333) + ((x>>2)&0x33333333); //00110011
x = (x&0x0f0f0f0f) + ((x>>4)&0x0f0f0f0f); //00001111
x = (x&0x00ff00ff) + ((x>>8)&0x00ff00ff); //0000000011111111
x = x + (x>>16);
printf("%d\n", x & 0x0000003f);
return 0;
}
4.代码风格一小点
if(A=='a') {……}
if('a'==A) {……}//哪种更好呢?
按照书上说的,第二条可以避免错写==为=……我觉得这个没那么重要吧,现在常常写的是变量名放前面