引言: 位运算就是直接对二进制进行操作, 不管是在Java语言,还是在C语言中,或者其他语言等等都是经常会用到的,本文以Java语言来举例子,展示和分析了位运算的使用和技巧。
1 位运算
1.1 基本概念
位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、右移(>>)、无符号右移(>>>)这几种,其中除了取反(~)以外,其他的都是二元运算符,即要求运算符左右两侧均有一个运算量。
概念: 位运算就是使用位运算符直接对整数在内存中的二进制位进行操作(参百度百科).
关于补码和原码: 在计算机中,整数是按原码(二进制)存的, 负数是按补码存的, 整数的补码和原码相同, 负数的补码等于原码取反后再加一。
示例:
3(正数的补码和原码相同)
原码:0000 0011
补码:0000 0011
-3(负数的补码等于原码取反后再加1)
原码:0000 0011
补码:1111 1101 即int型的-3可以表示为0b11111111_11111111_11111111_11111101
1.2 位运算符的使用
按位与(&):
使两个数对应的比特位进行按位与操作, 对应位同时为1, 其对应位的结果才为1
0000 1111
1111 1111
--------------------
0000 1111 即15&255 = 1111
按位或(|):
使两个数对应的比特位进行按位或运算, 对应位只要有一个1就为1, 否则为0
0000 1111
1111 1111
---------------------
1111 1111 即15|255 = 11111111
按位异或(^):
两个数对应比特位相同为0, 不同为1
0000 1111
1111 1111
---------------------
1111 0000 即15^255 = 1111 0000;
取反(~):
取反运算是个一元运算符, 对某个数进行取反运算, 使二进制的0变成1, 而1变成0
~15 ===> ~0b0000_1111 ===>1111 0000
左移(<<):
左移即将二进制数向左移n位. 某个数向左移1位相当于乘于2, 左移2位相当于乘于4, 以此类推向左移n位则这个数就乘于2^n
0000 1111<<2
--------------------------
0011 1100 <=> 15