学习了Java的数据类型和变量,今天我们将学习Java中的运算符,Java的运算符相关操作同C语言一样,这里我们主要讲解一些位运算符和移位操作符!!!
学前须知:
任何一个整数,在内存中都是按照二进制的补码存储的,原码的最高位是符号位,整数为0,负数为1;
对于一个整数来说:其原码,反码,补码都是一样的;
对于一个负数来说:其原码除符号位外按位取反为其反码,其反码+1为其补码
再说一遍,记住:所有整数都是按照补码形式存储在内存中的,若为正数补码=原码,若为负数则需要计算,通过补码求出反码再求出原码最后转换成整数
一·位运算符
1.1 按位与 &
![](https://i-blog.csdnimg.cn/blog_migrate/ec42124a87ba3376310cc654af8b36b7.png)
1.2按位或(|)
![](https://i-blog.csdnimg.cn/blog_migrate/322b33c61aad1ef806c977e4a3220ac8.png)
1.3按位取反 ~
![](https://i-blog.csdnimg.cn/blog_migrate/02ee3fb2c9e71ef6fcb73aa39a393f0b.png)
1.4 按位异或 ^
![](https://i-blog.csdnimg.cn/blog_migrate/f75cef9191693d8de341ca39c5492ddb.png)
二·移位操作符
2.1 左移操作符 <<
![](https://i-blog.csdnimg.cn/blog_migrate/abe2c14f3702c28eb27936dd18cfd1ee.png)
2.2 右移操作符 >>
![](https://i-blog.csdnimg.cn/blog_migrate/4bf10f684ae0b451b9b1fe5204d2ba70.png)
2.3 无符号右移 >>>
![](https://i-blog.csdnimg.cn/blog_migrate/fda9da511e3648020102fcf7d28d54c9.png)
总结:
根据上述总结,下次进行移位操作时,可以直接计算了!!!
学习完相关知识,我们一起来看两个题:
1.求一个整数,在内存当中存储时,二进制1的个数
法一:
思想:用这个数&1,若等于1则找到一个1,没进行一次&运算,让这个数右移,故32位需要右移31次
public static void main(String[] args) {
//输入一个数
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//计算1的个数
int count = 0;
for (int i = 0; i < 32; i++) {
if((num&1) == 1){
count++;
}
num = num>>1;
}
System.out.println(count);
}
法二:
思想:在法一的基础上进行优化,若某一次这个数进行完&运算之后已经等于0了,就不需要再继续查找了
public static void main(String[] args) {
//输入一个数
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//计算1的个数
int count = 0;
while(num != 0){
if((num&1) == 1){
count++;
}
num = num>>>1;
}
System.out.println(count);
}
法三:
思想:这是一个算法层面的方法,比较难想,每次用这个数num&(num-1),若不等于0,则count++,直至num=0时查找结束
public static void main(String[] args) {
//输入一个数
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//计算1的个数
int count = 0;
while(num != 0){
count++;
num = num&(num-1);
}
System.out.println(count);
}
2.获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列
思想:一个数的二进制序列,求奇数序列:从最右边第一个数开始,右移31位可移到第一个数,设初值i=31,然后&1进行判断,每进行一次&操作,i=i-2,直到i=1;求偶数序列:从右边第一个数开始,右移30位可以移到第二个数,设初值i=0,然后&1进行判断,每进行一次&操作,i=i-2,直到i=0。
public static void main(String[] args) {
//输入一个数
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
//假设输入的是7
//7的二进制序列为:00000000000000000000000000000111
//奇数序列:0000000000000001
//偶数序列:0000000000000011
for (int i = 31; i >= 1; i -= 2) {
System.out.print(((num >> i) & 1) + " ");
}
System.out.println();
for (int i = 30; i >= 0; i -= 2) {
System.out.print(((num >> i) & 1) + " ");
}
}
位运算及移位运算符的讲解到这里结束啦,希望大家可以好好消化这两个题目,对我们理解帮助非常大,同时这也是《剑指offer》上面的题目,感谢支持!!!