谈计算机编程的位运算技巧

位运算是什么  

    位操作是程序设计中对位模式按位或二进制数的一元和二元操作。大部分编程语言都提供了这几种运算符:1.  & 按位与    2.   | 按位或    3.  ^ 按位异或    4.  ~ 取反    5.  << 左移    6.  >> 右移。位运算一般都是用整形数字来进行,浮点数二进制是由定点数跟基数组成,位运算结果没意义。

位运算的技巧使用

    1.两个整数变量交换值

int main(int argc, const char * argv[]) {
    int a = 10, b = 15;
    printf("before swap: a=%d, b=%d", a, b);
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    printf("after swap: a=%d, b=%d", a, b);
    return 0;
}

相信很多程序员朋友都使用过这种方式,通过 ^ 异或运算符来实现。

    2.判断一个整数的奇偶性

int main(int argc, const char * argv[]) {
    int num = 5;
    bool isOddNumber = (num & 1) == 1;
    return 0;
}

通过判断整数二进制中的最低位是1还是0。

    3.用一个整数来表示多个状态    

      在看Linux内核相关书籍时,发现内存的可读,可写,可执行等这些状态可以用一个整数来存储,这个很有技巧。

public static void main(String[] args) {

        int NONE_STATUS      = 0;
        int READABLE_STATUS  = 1 << 1;
        int WRITEABLE_STATUS = 1 << 2;
        int EXECABLE_STATUS  = 1 << 3;

        int mmStatus = NONE_STATUS;

        mmStatus |= READABLE_STATUS;
        mmStatus |= WRITEABLE_STATUS;

        boolean isMmReadable = (mmStatus & READABLE_STATUS) == READABLE_STATUS;
        boolean isMmWriteable = (mmStatus & WRITEABLE_STATUS) == WRITEABLE_STATUS;
        boolean isMmExecable = (mmStatus & EXECABLE_STATUS) == EXECABLE_STATUS;
        System.out.println("mm readable: "+isMmReadable+", writeable: "+isMmWriteable+", execable:"+isMmExecable);

        // 通过取READABLE_STATUS的补码 也就是二进制中的1变为0  0变为  再进行 &运算  就可以将该位的1设为0
        mmStatus &= ~READABLE_STATUS;

        isMmReadable = (mmStatus & READABLE_STATUS) == READABLE_STATUS;
        isMmWriteable = (mmStatus & WRITEABLE_STATUS) == WRITEABLE_STATUS;
        isMmExecable = (mmStatus & EXECABLE_STATUS) == EXECABLE_STATUS;
        System.out.println("mm readable: "+isMmReadable+", writeable: "+isMmWriteable+", execable:"+isMmExecable);
    }

这种方式通过将二进制的每一个bit与对应的状态进行绑定,而状态也需要是2的n次幂。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值