chapter4 运算符及其优先级

来源:互联网 发布:整站优化seo 上海 编辑:程序博客网 时间:2024/05/01 10:28

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


0 0
原创粉丝点击