在开发的时候,经常听到别人说到位运算,虽然大部分的情况下用的不是特别的频繁。
1. 按位与(&)
定义:对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1。
简单的说就是数字二进制化,然后进行比较,相同位的数字都为1时,才能为1。
假设:A = 511,B=100,将数字转化成二进制,A=111111111,B=1100100,如图进行比较:
A&B=1100100,转化成十进制就是:100。
2.按位或(|)
定义:比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1)
简单的来说,就是相同的位置,只要不同时为0,那么就为1。
假设A = 341,B = 181,将数字转换成二进制,A = 101010101,B = 10110101,如图比较:
A | B = 111110101,转化为十进制:501
3.按位异或(^)
定义:比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0。
简单的来说就是相同的位数,相同为0,不同为1。
假设A = 20,B = 5,转化成二进制,A = 10100,B = 101,如图比较:
A ^ B = 10001,转化成十进制:17
4.按位取反(~)
定义:将操作数每一位都取反,1变0,0变1。
假设A = 43 如图:
这是Java的代码,前面的0b000000 表示是二进制的意思,这里就不简述为什么int的二进制是32位了。
取反就是将0变1,1变0,可以看出B就是A取反后的结果。
~A = - 44。
5.按位左移(<<)
定义:将操作数的所有位向左移动指定的位数,空位用0填充。比如:10 << 2 表示将10的二进制向左移动两位,将10转化为二进制:1010 ,向左移动两位,空余位用0补足。如图:
10 << 2 = 101000,转换成十进制为:40
6.按位右移(>>)
定义:将操作数的所有位向右移动指定的位数,空位用0填充。比如:10 >> 2 表示将10的二进制向右移动两位,将10转化为二进制:1010 ,向左移动两位,空余位用0补足。如图:
10 >> 2 = 10,转换成十进制:2