1,switch不加break为什么具有直通性?
switch没有循环,switch功能与if else一样。如果不加break,执行完一个case后还会继续执行下面的case语句,直到遇见break为止。(执行了多个case语句后就会有多个输出结果)
2,switch和if else哪个效率更高?
switch效率更高。
区别:if else要从上至下一层层比较,有点:不限比较类型和内容,可以使用 double、float、string或自定义类型。
switch可以直接选中,可读性更好。在多条件时建议使用switch。
有一种说法:编译器优化程度相同的情况下,switch语句击中第三个选项的时间跟if /else if击中第三个选项的时间相同。
击中第一,第二选项的速度if语句快,击中第四以及之后的选项的速度switch语句快。
所以,如果所有选项出现的概率相同:5个选项(包括default)的情况下,switch和if/else if相同。低于5个选项时if else快,高于5个选项时switch快。
3,计算1个整型数字的二进制中1的个数
n&(n-1)的妙用 (&:按位与)
举一个例子:n=0000 1011 n-1=0000 1010 n&(n-1)=0000 1010
n=0000 1010 n-1=0000 1001 n&(n-1)=0000 1000
n=0010 0000 n-1=0001 0000 n&(n-1)=0000 0000
n=0010 1100 n-1=0010 1010 n&(n-1)=0010 1000
总结:n&(n-1)将n的二进制表示中的最低位的1改为0;
应用:1,求某一个数的二进制表示中1的个数
int tmp = 0;
while(n>0)
{
tmp++;
n=n&(n-1); //n&=(n-1)
}
eg:0000 0110 tmp=0 --> 0000 0100 tmp=1 --> 0000 0000 tmp=2 -->跳出循环
2,判断一个数是否是2的方幂
满足n>0&&((n&(n-1))==0)时,n为2的方幂
eg:n 0000 0010 n&(n-1) 0000 0000 n=2^1 为2的方幂
n 0001 0000 n&(n-1) 0000 0000 n=2^4 为2的方幂
n 0011 0100 n&(n-1) 0011 0000 n=2^5+2^4+2^2 不是2的方幂
3,待续。。。