进制及位运算
进制及位运算
一、进制
1、分为十进制、二进制、八进制和十六进制
2、逢进制进一
3、十进制:
(1)逢十进一
(2)形式:234=2*10^2+3*10^1+4*10^0
(3)数字只能是0到9
4、二进制
(1)逢二进一
(2)形式:1010=1*2^3+0*2^2+1*2^1+0*2^0=10(二进制转化成十进制)
(3)记住8421 2^10=1024
(4)在计算机中能够大量使用
(5)十进制转二进制,用除二取余法
5、八进制
(1)逢八进一
(2)形式:567=5*8^2+6*8^1+7*8^0=375(八进制转化成十进制)
(3)二进制转化成八进制的规律:每三位转化成一位八进制
例:001-111-000-101-010→17052 756→111-110-101
(4)在老的编辑语言中,使用八进制
6、十六进制
(1)逢十六进一
(2)0-F分别表示0-15:A=10、B=11、C=12、D=13、E=14、F=15
(3)颜色,经常用两个十六进制位表示八个二进制位
(4)形式:E2=E*16^1+2*16^0=14*16^2+2*16^0=226(十六进制转化成十进制)
(5)二进制转为十六进制的规律:每四位转化成一位十六进制
例:1011-1101→BD AF1→1010-1111-0001
7、m进制转十进制:m^(n-1)+m^(n-2)+m^(n-3)+……+m^0(初始数据为11111……111)
8、十进制转m进制:除m取余数
二、位运算
1、位运算的性能高
2、分为&(与)、|(或)、^(异或)、~(取反)、>>(右移)、<<(左移)、>>>(无符号移动)
3、&:按位与,两个都是1才为1
例:class BitDemo1{
public static void main(String[] args){
int a=12;int b=4;
int c=a&b;
System.out.println(c);
}
}
12:0000-0000 0000-0000 0000-0000 0000-1100
4: 0000-0000 0000-0000 0000-0000 0000-0100
规则:两个都是1才为1;只要有一个是0就是0
结果:0000-0000 0000-0000 0000-0000 0000-0100:4
4、|:按位或,只要有一个是1就是1
例:class BitDemo2{
public static void main(String[] args){
int a=10;
int b=6;
int c=a|b;
System.out.println(c);
}
}
public static void main(String[] args){
int a=10;
int b=6;
int c=a|b;
System.out.println(c);
}
}
10: 0000-0000 0000-0000 0000-0000 0000-1010
6: 0000-0000 0000-0000 0000-0000 0000-0110
结果:0000-0000 0000-0000 0000-0000 0000-1110:14
5、^:异或
(1)不同为1
例:class BitDemo3{
public static void main(String[] args){
int a=10;
int b=6;
int c=a^b;
System.out.println(c);
}
}
int a=10;
int b=6;
int c=a^b;
System.out.println(c);
}
}
10: 0000-0000 0000-0000 0000-0000 0000-1010
6: 0000-0000 0000-0000 0000-0000 0000-0110
结果:0000-0000 0000-0000 0000-0000 0000-1100:12
6: 0000-0000 0000-0000 0000-0000 0000-0110
结果:0000-0000 0000-0000 0000-0000 0000-1100:12
(2)一个数和另一个数异或两次还是自己本身
一个数和自身异或结果是0
一个数和0异或结果还是自己本身
例:class BitDemo5{
public static void main(String[] args){
int a=10;
int b=6;
a=a^b;
b=a^b;
a=a^b;
System.out.println(a);
System.out.println(b);
public static void main(String[] args){
int a=10;
int b=6;
a=a^b;
b=a^b;
a=a^b;
System.out.println(a);
System.out.println(b);
//目的:交换ab的值
// b^b
// 10101001
// 10101001===0;
// a^0
// 1111001010
// 0000000000
// 1111001010
//a^b^b=a;
//a=a^b=10^6;
// b=a^b=10^6^6=10;
// a=a^b=10^6^10=6;
}
}
// b^b
// 10101001
// 10101001===0;
// a^0
// 1111001010
// 0000000000
// 1111001010
//a^b^b=a;
//a=a^b=10^6;
// b=a^b=10^6^6=10;
// a=a^b=10^6^10=6;
}
}
(3)可以用作对称加密,解密
6、~:按位取反:0变成1,1变成0
例:class BitDemo7{
public static void main(String[] args){
int a=10;
int c=~a;// 对a按位取反,
// 负数的二进制等于正数的二进制取反+1
// -10=~a+1
// -10=c+1
// c=-11
System.out.println(c);
}
}
public static void main(String[] args){
int a=10;
int c=~a;// 对a按位取反,
// 负数的二进制等于正数的二进制取反+1
// -10=~a+1
// -10=c+1
// c=-11
System.out.println(c);
}
}
结果:-11
7、>>:右移,m>>2:右移2位
(1)右移动多少位就是除以2的多少次方
(2)正数右移,最高位补0,最小是0
(3)负数右移,最高位补1,最小是1
(4)右移的时候,余数一定是正数
例1:class BitDemo8{
public static void main(String[] args){
int a=10;
int c=a>>3;
public static void main(String[] args){
int a=10;
int c=a>>3;
// 10/2^1=5 右移一位是5
// 10/2^2=10/4=2; 右移两位是2
// 10/2^3=10/8=1 右移三位是1
System.out.println(c);
}
// 10/2^2=10/4=2; 右移两位是2
// 10/2^3=10/8=1 右移三位是1
System.out.println(c);
}
}
例2:class BitDemo9{
public static void main(String[] args){
int a=-5;
int c=a>>2;
// -10/2^1=-5 右移一位
//余数肯定是正数
//-10/2^2=-10/4= -3 2;右移两位
// -10/8= -2 6;右移三位
// -17 4 / -5 3(运算负数位移的时候,余数一定是正数)
// -180/16 a=-180;c=a>>4;
// -90/8
// -45/4 -12 3
// -5/4 -2 3 a=-5;c=a>>2;
System.out.println(c);
}
}
public static void main(String[] args){
int a=-5;
int c=a>>2;
// -10/2^1=-5 右移一位
//余数肯定是正数
//-10/2^2=-10/4= -3 2;右移两位
// -10/8= -2 6;右移三位
// -17 4 / -5 3(运算负数位移的时候,余数一定是正数)
// -180/16 a=-180;c=a>>4;
// -90/8
// -45/4 -12 3
// -5/4 -2 3 a=-5;c=a>>2;
System.out.println(c);
}
}
8、<<:左移,m<<2,左移两位
(1)左移动多少位就是乘以多少次方
(2)左移后面补0
9、>>>:无符号移动,最高位都补充0