目录
一、算术运算符
二、关系运算符
三、位运算符
四、进制详解
五、原码、反码、补码
一、算术运算符
表格中的实例假设A = 20 ,B = 10
+ | 加法 - 相加运算符两侧的值 | A + B 等于 30 |
- | 减法 - 左操作数减去右操作数 | A – B 等于 10 |
* | 乘法 - 相乘操作符两侧的值 | A * B等于200 |
/ | 除法 - 左操作数除以右操作数 | A/B等于2 (下文举例) |
% | 取余 - 左操作数除以右操作数的余数 | A%B等于0 (下文举例) |
++ | 自增: 操作数的值增加1 | B++ 或 ++B 等于 21(区别详见下文) |
-- | 自减: 操作数的值减少1 | B-- 或 --B 等于 19(区别详见下文) |
1、/ 除法 和 % 取余 举例
例如:一个三位数ABC;其中 A是百位数,B是十位数,C是个位数 ; 将这个三位数的值变位置 即BCA,如何获取BCA的值
// 举例
int d = 268;
d = d/10%10*100 + d%10*10 + d/100;
System.out.println(d); // 打印结果为:682
2、++ 自增
(1)++前:如果一个表达式里面有多个操作,先执行++,在执行其他操作
int a = 2;
int b = ++a; // ++在前,先算a = a + 1后,在把a赋值给b
System.out.println(b); // b的结果为:3
(2)后++:如果一个表达式里面有多个操作,先执行其他操作,在执行++
int a = 2;
int b = a++; // ++在后,先把a的值赋值给b后,在算a = a+1
System.out.println(b); // b的结果为:2
3、-- 自减
(1)-- 前:如果一个表达式里面有多个操作,先执行--,在执行其他操作
int a = 2;
int b = --a; // --前,先算a = a - 1后,在把a赋值给b
System.out.println(b); // b的结果为:1
(2)后 --:如果一个表达式里面有多个操作,先执行其他操作,在执行--
int a = 2;
int b = a--; // 后--,先把a的值赋值给b后,在算a = a-1
System.out.println(b); // b的结果为:2
二、关系运算符
== | 检查如果两个操作数的值是否相等,如果相等则条件为真 | (A == B)为假 |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真 | (A != B) 为真 |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真 | (A> B)为假 |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真 | (A <B)为真 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真 | (A> = B)为假 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真 | (A <= B)为真 |
三、位运算符
& 按位与 :将两个数字的二进制方式一一对应,如果对应位置数字都为1,结果对应 位的就为1,否则为0(只要有一个0,结果对应位置的数字也为0)
int n = 3; //0011 3转四位数二进制
int m = 6; //0110 6转四位数二进制
int q = n & m; //0010 3和6二进制一一对应,都为1时取1,否则取0 -->2转10,为2
System.out.println(q); // 打印结果为:2
| 按位或:对应位置只要有1,结果对应位置的数字就为1
int n = 3; //0011 3转四位数二进制
int m = 6; //0110 6转四位数二进制
int q = n | m; //0111 -----> 2进制转10进制,为7
System.out.println(q); // 打印结果为:7
^ 按位异或:对应位置的数字不一样,结果对应位置的数字就为1,否则为0
int n = 3; //0011 3转四位数二进制
int m = 6; //0110 6转四位数二进制
int q = n ^ m; //0101 -----> 2进制转10进制,为5
System.out.println(q); // 打印结果为:5
~ 按位取反:将原来的数字每一位取反,是1的地方变成0,是0变成1
int abc = ~5;
System.out.println(abc); //结果为-6
四、进制详解
十进制: 假设用三位数表示一个数字 逢10 进 1,每一位数值变化范围为0-9
000
001
002
...
009
010
...
099
100
二进制:逢2进1 ,每一位数值变化范围为0-1
000
001
010
011
100
八进制:逢8进1 , 每一位数值变化范围为0-7
000
001
002
003
...
007
010
十六进制:逢16进1,每一位数值变化范围为0-F F表示16
000
001
002
...
009
00A A表示10
00B B表示11
...
00F F表示15
010 16
进制之间的转换
1、10进制转2进制
10:13转换成2:13
方法:用数字除以2取余,一直除以2,直到商为0为止,然后将得到的所有余数倒序
2、2进制转10进制
1101011
方法:计算每一位数字*2(位权),将所有的结果相加可以得到10进制的数字
1*2(0)+ 1*2(1)+ 1*2(3)+1*2(5)+ 1*2(6) = 1+2+8+32+64 = 107
123 = 100 + 20 + 3 = 1*10(2) + 2*10(1) + 3*10(0) 位权
同理:
10转8 :除8取余
8转10:每一位*8(位权)+
10转16:除16取余
16转10:每一位*16(位权)+
3、2转8: 先转10再转8,一位8进制等价于3位二进制
参照表
8 --> 0 1 2 3 4 5 6 7
2 --> 000 001 010 011 100 101 110 111
010 101 011 101 010 101 二进制转八进制-----> 253525
47231 八进制转二进制--->100111010011001
4、2转16:一位16进制的数对应4位二进制
16: 0 1 2 3 4 5 6 7 8
2: 0000 0001 0010 0011 0100 0101 0110 0111 1000
16: 9 A B C D E F
2: 1001 1010 1011 1100 1101 1110 1111
0101 1110 1010 1101 0101 二进制转16进制---> 5EAD5
5、8转16:8先转2再转16
五、原码、反码、补码
每一个类型的变量在内存中所占的内存大小不一样
int 4B(4字节) 32b(32位)
char 2B 2字节 16b
short 2B 2字节 16b
long 8B 8字节 64b
float 4B 4字节 32b
double 8B 8字节 64b
byte 1B 1字节 8b
boolean 1B 1字节 8b
举例: int ABC = ~5; 5的原码 // 00000000 00000000 00000000 00000101
5的反码 // 11111111 11111111 11111111 11111010
int类型二进制位的最高位是符号位,0表示这个数字是正数,1表示负数
原码:正数的二进制表示方式,5的原码
00000000 00000000 00000000 00000101
反码:在原码的基础上取反
11111111 11111111 11111111 11111010
补码:补码在反码的基础上+1
11111111 11111111 11111111 11111011
原码 ->按位取反 ->反码 ->+1 ->补码
补码 ->-1 ->反码 -> 取反->原码
正数在内存中是以原码的形式存储,如果想要读取该数字是多少,直接将二进制的原码转换成10进制的数字,就可以直接得到真实的数字
负数在内存中是以补码的形式存储,如果想要得到真实的数字是多少,需要先转换成原码,再转10进制
位运算符都是直接操作的内存
5:
原码 00000000 00000000 00000000 00000101
通过取反将内存修改成了
反码 11111111 11111111 11111111 11111010 负数
表示这个数字是负数,计算机就认为这个是补码
补码-1: 11111111 11111111 11111111 11111001 反码
取反得到原码:00000000 00000000 00000000 00000110 二进制转换成10进制得到 -6