20世纪被称作第三次科学革命的重要标志之一的电子计算机的发明和应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是2进制。19世纪 由爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式 开发实现。
十进制转二进制方法
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
二进制转十进制方法
要从右到左用二进制的每个数去乘以2的相应次方,或者把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
二进制数1000110转成十进制数可以看作这样:
数字中共有三个1 即第一位一个,第二位一个,第六位一个,然后对应十进制数即2的1次方+2的2次方+2的6次方, 即1000110=64+0+0+0+4+2+0=70
例子:
十进制数字57转换为二进制方法:
用二进制表示57则为(按权展开):111001=2^(6-1)+2^(5-1)+2^(4-1)+2^(1-1)=32+16+8+1=57
![十进制换算二进制][2]
换算为二进制采用短除2
除法 商 余数
2|5 2 1
2|1 0 1
直到商为0,再将余数倒序排列
![常用进制的换算][3]
![适合计算机的进制8、16都是2的整数次方,所以常用。][4]
![二进制 8进制:适用于12和36位的计算机系统][5]
![二进制][6]
![常用进制的换算][7]
![二进制转十进制][8]
位运算
按位与 &: 同为1,为1 作用:清零、指定位求反
按位或 |: 同为0,才为0 作用:清零、指定位求反
按位异或 ^:相同,则为0 作用:清零 、做中间变量
正数:原码=补码=反玛;
负数:反码=^原码,补码=反码+1;
@二进制基础——位运算
一、异或作用
1、对某个数定位翻转:0^0=0 1^0=1 0^1=1 1^1=0
· 翻转位异或1
· 不翻转位异或0
2、两个变量值交换:A=A^B;B=A^B;A=A^B(条件:A!=B)
二、左右移
1、左移<< :左丢弃,右补0,但注意整形为32位
2、右移>> :右丢弃,左补0(整数)或者1(负数)
3、无符号右移>>> : 右丢弃,左补0
![负数以其正值的补码形式表示(1/2)原码反码补码][9]
![左移(<<)运算][10]
![右移(>>)运算][11]
![无符号右移(>>>)运算][12]
![二进制位运算][13]
(一)按位与&
特殊运输
(1)清零,如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都是零的数值相与,结果为零。
(2)取一个数中指定位:找一个数,对应x要取的位,该数的对应位为1,其余位为零,此数与x进行“与运算”可以得到x中的指定为
(二)按位或|
特殊用法
常用来对一个数据的某些位置1:找到一个数,对应x要置1的位,该数的对应位为1,其余位为零。此数与x相或可使x中的某些位置1。
(三)异或^
特殊用法
(1)使特定位翻转:特定位异或1
(2)与0相异或,保留原值
(3)两个变量交换值
1.借助第三个变量来实现
2.利用加减法实现两个变量的交换
A=A+B;B=A-B;B=A=B
3.异或运算
一个数异或本身等于0和异或运算符合交换律
A=A^B;B=A^B;A=A^B
(四)取反与运算~
对一个二进制数按位取反,即将0变为1,1变0
(五)左移<<
将一个运算对象的各二进制位全部左移若干位,
(六)右移>>
将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。操作数每右移一位,相当于该数除以2
(七)无符号右移运算>>>
各个位向右移指定的位数。右移后左边空出的位用零来填充。移除右边的位被丢弃。
负数以其正数的补码形式表示
反码加1称为补码
32位整数,最高位为1,就是负数
负数 左移或者右移
![负数以其正值的补码形式表示(2/2)][14]
按位与&:两位全为1,结果位才为1
(清零、取一个数中的指定位)
|:两位只要有一个位为1,结果位就为1
(将一个数的某些位置1)
^:两位相异则该位结果为1,否则为0
![异或(^)运算 (续上)][15]
1.二进制位运算:
(1)且运算,1 & 1 = 1, 0 & 1 = 0;
(2)或运算,1 & 0 = 1
(3)异或运算,1 ^ 1 = 0,1 ^ 0 = 1; 两个位的值不同,则结果为1,相同结果为0.
(4)<<左移运算符,还有看看是否有符号位。
(5)>>右移运算符,还要看看是否有符号位。
(6)~按位取反, ~1 = 0, ~0 = 1
(7)>>>无符号右移运算符,二进制各个位向右移指定的位数,右移后左边空出来的位用零来填充,移出右边的位被丢弃。
(8)<<<无符号左移运算符,二进制各个位向左移指定的位数,左移后右边空出来的位用零来填充,移出左边的位被丢弃。
【位运算的作用:(1)清零 (2)取一个数中指定位】
2.原码,反码(对原码的每一个二进制位取反),补码 = 反码 + 1。
JDK内置的进制转换
![Java中内置的进制转换方法][16]
@二进制——JDK内置的进制转换
static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析。
static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
parseInt(“1011001”,2) 含义为将二进制转为十进制。同样可以用parseInt(“45”,8)来讲八进制数45 转为十进制。调用方法为: Integer.parseInt(…)
![此处输入图片的描述][17]
java内置的进制转换
Integer.parseInt(“0100101”,2);//二进制转换为十进制
Integer.parseInt(“23”,8);//八进制转换为十进制
Integer.parseInt(“A2”,16);//十六进制转换为十进制
位运算的几个应用:
1) 判断int型变量a是奇数还是偶数
a&1 = 0 偶数
a&1 = 1 奇数
2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1 (先右移再与1)
3) 将int型变量a的第k位清0,即a=a&~( 1 < < k) (10000 取反后为00001 )
4) 将int型变量a的第k位置1,即a=a|(1<< k)
5) int型变量循环左移k次,即a=a<< k|a>>16-k (设sizeof(int)=16)
6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)
7)对于一个数 x >= 0,判断是不是2的幂。
boolean power2(int x){return ( (x&(x-1))==0) && (x!=0);}
(8)不用temp交换两个整数
void swap(int x , int y)
{x ^= y;y ^= x;x ^= y;}
(9)计算绝对值
int abs( int x ){int y ;y = x >> 31 ;
return (x^y)-y ; //or: (x+y)^y
}
10)取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a & (2^n - 1)
11)乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 a<< n
12)除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 a>> n
例: 12/8 == 12>>3
13) a % 2 等价于 a & 1
14) if (x == a)
x= b;
else x= a;
等价于 x= a ^ b ^ x;
15) x 的 相反数 表示为 (~x+1)
16)输入2的n次方:1 << 19
17)乘除2的倍数:千万不要用乘除法,非常拖效率。只要知道左移1位就是乘以2,右移1位就是除以2就行了。比如要算25 * 4,用25 << 2就好啦
![基本数据类型][18]
Java中的数据类型:
一、四种基本类型:
1、int类型:
1.1、byte(Byte):8bit;
1.2、short(Short):16bit;
1.3、int(Integer):32bit;
1.4、long(Long):64bit;
2、float类型:
2.1、单精度:float(Float),32bit;
2.2、双精度:double(Double),64bit;
3、boolean(Boolean)类型:取值true或false;
4、char(Character)类型:Unicode字符,16bit;
注:括号中为该类型对应的类类型!
![大小端][19]
![大小端(2/2)][20]
![字符串与字节的转化][21]
在服务器客户端模型中, 客户端使用java,发送serializable参数,服务器de-serializable。
C作为更加底层的语言,服务器若使用c会更具效率,但无法做到de-serializable,因此改为由客户端发出0,1表示的二进制参数。因此也就用到了java中二进制,位操作的内容。