位运算符主要包括下表中所列的几种:
运算符 | 含义 | 用法 | 运算分类 |
~ | 按位取反 | ~op1 | 按位运算 |
& | 按位与 | op1&op2 | |
| | 按位或 | op1|op2 | |
^ | 按位异或 | op1^op2 | |
<< | 左移 | op1<<op2 | 移位运算符 |
>> | 右移 | op1>>op2 | |
>>> | 无符号右移 | op1>>>op2 |
使用位运算实现乘法,利用的是左移符号。
举例:不使用“*”,计算21*16的值。
分析:21转换为二进制为10101,16转换为二进制为10000.
10000等价于左移四位,所以21*16的值等价于将21的二进制的值左移四位,使用代码实现:
/**
* 使用移位运算符计算21*16
*/
int a = 21; //转换为二进制为10101
int b = 16; //转换为二进制为10000
System.out.println("a="+a+",b="+b);
int c = a*b; //将a*b的值赋给c,用于比较移位运算符的结果准确性
int d = a<<4; //将a直接左移四位
System.out.println(c);
System.out.println(d);
计算结果均为336
延伸:计算21*21的值,同样不使用“*”,而是用移位运算符计算。
思考:21的二进制表示为10101,这次的乘数为21,不能简单的使用左移运算符。
21*21,转换为二进制是10101*10101,由于二进制运算的特殊性,可以拆分为10101*10000、10101*00100和10101*00001三个式子的和,如此看来,即将10101分别左移4位,左移2位和左移0位,然后求和。
利用代码实现:
/**
* 使用移位运算符,计算21*21的值
*/
int num1 =21; //21的二进制值为10101
int num2 =21;
int num3 = 21*21; //声明num3作对照
int num4 = (num1<<4)+(num1<<2)+num1;
System.out.println(num3);
System.out.println(num4);
计算结果均为441