x|(x+1)统计0的个数,循环把x的二进制中从右往左数的最后一位0变成1,直到变成全1的时候x+1就溢出为全0,循环结束。x&(x-1)统计1的个数,循环把x的二进制中从右往左数的最后一位1变成0,直到变成全0,循环结束。
做题时对于符号的优先级不清楚导致出错,同时没有系统性的拆分
a+=a-=a+a可以拆分为1.a-=a+a,此时a=-9,2.a+=a;所以结果为-18
1.C/C++中浮点数由符号位、阶码和尾数构成,其二进制表示并不直接对应浮点数的大小,因此浮点数类型不能进行位运算,否则编译器报错;
2.虽然浮点数标准IEEE 754满足除法和乘法的交换律,不满足加法结合律
3.浮点数存在误差,直接比较大小往往不是预期的结果;
1. 方便管理内存缓冲区:如果用指针 char* 代替 char data[0] 来指向新开辟的空间,需要两次malloc也需要两次free。用char data[0],一次malloc即完成,方便管理缓冲区。
2. 减少内存碎片化:如果在struct尾部用指针*指向新开辟的buffer长度,struct本身相较buffer长度是很小的,即碎片化的内存。而用char data[0]指向新开辟的buffer,只需一次malloc,struct和buffer的空间是连续的。即减少了内存的碎片化。
3. 节省空间,相较用指针指向新开辟的str,data[0]是不占用内存的,而指针占用4字节。
1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b
2. 条件运算符?和:是一对运算符,不能分开单独使用。
3. 条件运算符的结合方向是自右至左