学习了Java的数据类型和变量,今天我们将学习Java中的运算符,Java的运算符相关操作同C语言一样,这里我们主要讲解一些位运算符和移位操作符!!!
学前须知:
任何一个整数,在内存中都是按照二进制的补码存储的,原码的最高位是符号位,整数为0,负数为1;
对于一个整数来说:其原码,反码,补码都是一样的;
对于一个负数来说:其原码除符号位外按位取反为其反码,其反码+1为其补码
再说一遍,记住:所有整数都是按照补码形式存储在内存中的,若为正数补码=原码,若为负数则需要计算,通过补码求出反码再求出原码最后转换成整数
一·位运算符
中数据存储的最小单位是字节,而数据操作的最小单位是比特位
.
字节是最小的存储单位,每个字节是由
8
个二 进制比特位组成的,多个字节组合在一起可以表示各种不同的数据。
:
& | ~ ^ ,除
~
是一元运算符外,其余都是二元运算符。
按二进制位运算
.
计算机中都是使用二进制来表示数据的
(01
构成的序列
),
按位运算就是在按照二进制位 的每一位依次进行计算.
1.1 按位与 &
1,
则结果为
1,
否则结果为
0.
(作用:寻找二进制中的1)
1.2按位或(|)
0,
则结果为
0,
否则结果为
1. (作用:寻找二进制中的0)
1.3按位取反 ~
0
则转为
1,
如果该位为
1
则转为
0(单目操作符)
1.4 按位异或 ^
,
则结果为
0,
相异则结果为
1. (作用:找不同)
二·移位操作符
:
<< >> >>>
,都是二元运算符,且都是按照二进制比特位来运算的
2.1 左移操作符 <<
<<
:
最左侧位不要了
,
最右侧补
0.
2.2 右移操作符 >>
>>
:
最右侧位不要了
,
最左侧补符号位
(
正数补
0,
负数补
1)
2.3 无符号右移 >>>
>>>:
最右侧位不要了
,
最左侧补
0.
总结:
根据上述总结,下次进行移位操作时,可以直接计算了!!!
学习完相关知识,我们一起来看两个题:
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》上面的题目,感谢支持!!!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/89464.html