• 《程序员面试宝典》编程技巧--位运算


    1. 判断一个整数是否是2的N次方:

    x&x-1

    如果X为2的N次方,例如二进制1000,结果就会为0。这个方法非常巧妙,还可以用来判断一个整数中,二进制表示中1的个数,如下:

    int count = 0;
    输入m;
    while(m)
    {
         count++;
         m=m&(m-1);
    }

    每执行一次,会把m中最低位的1清零。所以最终count最终就得到m中1的个数。

    2. 不用判断语句求a、b中的最大值:

    int max = ((a + b) + abs(a-b)) / 2;
    int tmp=a+b;
    char * strs[2] = {"a大",“b大”}
    tmp = unsigned(tmp) >> (sizeof(int)*8 - 1);
    cout <<strs[c]<<endl;

    这里利用了负数,最高位符号为1的特性。如果b大于a,tmp就为负数,利用无符号数的右移位(高位补零),留下tmp最高位,即符号位。

    3. 不使用中间变量交换a、b的值:

    a = a + b;
    b = a - b;
    a = a - b;

    a + b得到的结果可能会越界。下面的方法则不会存在这样的问题。

    a = a ^ b;//异或
    b = a ^ b;
    a = a ^ b;

    4.计算机内部数的表示---二进制运算

    int b = 0x80000000//为-2147483648

    对于0:原码有两种表示方法;
    [+0]=0x00000000;

    [-0]=0x80000000;

    对应的反码也有两种表示。

    不过补码只有一种:

    [+0]=[-0]=0x0000000;

  • 相关阅读:
    前端面试题
    js collection
    javascript变量声明提升(hoisting)
    css3动画
    神奇的meta
    wap站bug小结
    前端collection
    js拾遗
    prototype之初印象
    自定义scrollBottom的值
  • 原文地址:https://www.cnblogs.com/XDJjy/p/3894967.html
Copyright © 2020-2023  润新知