十进制转其他进制
公式:除基取余,直到商为0,把余数反转拼接
十进制10转换二进制
商 余数
10/2 5 0
5/2 2 1
2/2 1 0
1/2 0 1
把余数反转拼接:1010
....
原码反码和补码
原码:一个二进制数据,最高位符号位(0表示正数,1表示负数),后面的叫数值位
符号位 数值位
0 0000101 +5
1 0000101 -5
正数:正数的原码、反码和补码都是一样
负数的反码:符号位不变,数值位取反
符号位 数值位
原码 1 0000101
反码 1 1111010
负数的补码:在反码的基础上+1
符号位 数值位
原码 1 0000101
反码 1 1111010
补码 1 1111011
注意:计算机中所有的数据运算都是用【补码进行运算的】
5+(-7)=-2
5是正数,其原码、反码、补码都是一样的
00000101
-7的原码、反码、补码、依次算出来
符号位 数值位
原码 1 0000111
反码 1 1111000
补码 1 1111001
5+(-7)的底层运算是用补码进行运算
00000101 5的补码
+1 11111001 -7的补码
--------------
11111110 补码
-1 00000001
-------------------
11111101 反码
10000010 原码 -2
位运算
&(位与) |(位或) ^(位异或) ~(取反)
运算规则:
&(位与): 把需要运算的数据转换为二进制,每一位逐一进行位与运算
1&1=1; 1&0=0; 0&0=0; //无0为1,有0为0
|(位或): 把需要运算的数据转换为二进制,每一位逐一进行位或运算
1|1=1; 1|0=1; 0|0=0; //有1为1,无1为0
^(位异或):把需要运算的数据转换为二进制,每一位逐一进行位异或运算
1^1=0; 0^0=0; 1^0=1; 0^1=1 //相同为1,不同为0
特点:一个数被另一个数异或两次,等于这个数本身
~(取反): 把需要运算的数据转换为二进制,每一位0变1,1变0
<<(左移) >>(右移) >>>(无符号右移)
运算规则:
<<(左移):在二进制数据的最右边补对应位数的0,左边符号位被丢弃
相当于乘以2的几次幂
>>(右移):在最左边补对应位数的符号位,最后边的舍弃
相当于除以2的几次幂,例如:数学计算中 15/4=3.75,但java中:int a=15;
int b=4;
int c=a/b; //其结果为3,舍弃小数位
>>>(无符号右移):无论是正数还是负数,在最左边补对应位数的0
数据交换【重点】
两个数据交换,可以采用第三方变量。
int a=9;
int b=10;
//定义第三方变量
int temp=a;
a=b;
b=temp;
System.out.println("a:"+a);
System.out.println("b:"+b);
还可以采用位异或的方式,利用一个数被另一个数异或两次,结果等于这个数本身的特点。
int a=9;
int b=10;
//采用异或的特点
a=a^b; //a=9^10
b=a^b; //b=9^10^10=9 这一步中相当于 b=(a^b)^b 等号右边的皆为原始 a,b 值
a=a^b; //a=9^10^9=10 这一步中相当于 a=(a^b)^((a^b)^b) 等号右边的皆为原始 a,b 值