位运算数学意义及应用场景

2019-04-13  本文已影响0人  勤劳的熊熊

简介

梳理一下位运算定义、数学意义以及它的应用场景,在日常编码中能给我们带来什么提升。

运算定义

了解原码反码和补码

原码:00000000 00000000 00000000 00000101
反码:11111111 11111111 11111111 11111010
补码:11111111 11111111 11111111 11111011

<<(左移)

>> (带符号右移)

>>> (不带符号右移)

&(按位与)

计算过程:
5 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
计  算  结  果:0000 0000 0000 0000 0000 0000 0000 0001

|(按位或)

计算过程:
5 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
计  算  结  果:0000 0000 0000 0000 0000 0000 0000 0111

^(位异或)

计算过程:
5 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
3 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0011
计  算  结  果:0000 0000 0000 0000 0000 0000 0000 0110

~(位非即反码)

计算过程:
5 转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101
计  算  结  果:1111 1111 1111 1111 1111 1111 1111 1010

实际应用

判断奇偶
a&1 == 0 ; //偶数
a&1 == 1;  //奇数
整数平均数
// (x+y)/2可能产生溢出
int average(int x, int y) {   
     return (x&y)+((x^y)>>1);
}
不用临时变量交换两个数
x ^= y;
y ^= x;
x ^= y;
状态标识

商品有多种状态,比如是否支持货到付款、是否虚拟商品、是否预售商品、是否图书商品、是否可开增票等,我们可以用五位的二进制来标识对应的状态,如10010,表示该商品是支持货到付款的图书商品

趣味案例

有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

上一篇下一篇

猜你喜欢

热点阅读