chapter4 运算符及其优先级

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值