生活中常见的进制 十进制、十二进制、十六进制、二十进制、六十进制、三百六进制
计算机 ---二进制----萊布尼兹---伏羲
二进制 | 十进制 | |
---|---|---|
基本数字 | 10个 0-9 | 2个 0-1 |
进位规则 | 十进一 | 二进一 |
权位 | 不同位置所代表的值不同 | 不同位置所代表的值不同 |
二,进制的相关概念
十进制 7 = 二进制 0111-----0*2^(3)+1*2^(2)+1*2^(1)+1*2^(0);
二进制
计算机内部用二进制:运算简单,简化了计算机结构
八进制
适用用12位和36位计算机操作系统 标志的开头用0表示,用0-7的数字表示
十六进制
用0-9,A,B,C,D,E,F表示
表示表达长度短,变得更常用,标志的开头用0X表示
三,进制的探索
二进制的位运算
直接对二进制的位直接进行操作
运算符 | 运算 | 示例 |
---|---|---|
& | 与运算 | 6&3=2 |
| | 或运算 | 6|3=7 |
^ | 异或运算 | 6^3=5 |
~ | 反码 | ~6=-7 |
<< | 左移 | 3<<2=12 3*2*2=12 |
>> | 右移 | 3>>1=1 3/2=1 |
>>> | 无符号右移 | 3>>>1=1 3/2=1 |
优点
特定情况下,计算方便,速度快,被支持面广
如果用算术方法 速度慢 逻辑复杂
1.按位与 &
两位全为1 结果才为1
0&0=0 0&1=0 1&1=1
特殊用法
(1)清零。与一个各个位全为0的数值相与,结果为0
(2)取一个数中指定位。
设X=1010 1110 取X的低四位 ,X&0000 1111即可得到
2.按位或|
有1为 1
常用来对一个数据的某些位 置1
3.与或运算
相同为0 相反为1
异或运算的特殊用途
(1)使特定位翻转 找到一个数 对应X要翻转的各位 该数对应位为为1,其余位为0 ,此数与X对应位异或即可。
例:X=1010 1110 使低四位翻转 ,用X^0000 1111=1010 0001
(2) 与0异或,保留原值
(3)两个变量值交换
1,借助第三个变量来实现
C=A;A=B,B=C
2.利用加减法实现两个变量的交换
A=A+B;B=A-B;A=A-B;
3.用异或运算来实现 ,也是效率最高
原理:利用一个数异或本身为0和异或运算符合交换律
A=A^B;B=A^B;A=A^B;
4.取反运算~
对一个二进制数按位取反
~1=0 ~0=1
5.左移运算<<
将一个运算对象的各个二进制全部左移若干位(左移的二进制丢弃,右边补零)
2<<1=4
若左移是舍弃的高位不包含1,则左移一位,相当于乘以2
6.右移运算 >>
将一个数的各个二进制全部右移若干位 ,正数补0 ,负数补1,右边丢弃。操作数每右移一位,相当于该除以2
左补0 or 补 1 得看被移数是正还是负
例 1:1=4>>2; 0100>>2 =0001
7.无符号右移运算>>>
各个位向右移 指定的位数 。右移后左边空出来的位用零来填充,移除的右边位被丢弃
负数以其正值的补码形式表示
原码
一个数按照绝对值大小转换成的二进制数为原码
例如 00000000 00000000 00000000 00001110是14的原码
反码
将二进制数按位取反,所得的新二进制数称为二进制的反码
例如 00000000 00000000 00000000 00001110 按位取反
11111111 11111111 11111111 11110001 它们互为反码
补码
反码加1称为补码
11111111 11111111 11111111 11110001+1=11111111 11111111 11111111 11110010
-14(11111111 11111111 11111111 11110010)
四,JAVA内置的进制转换
十进制转换成十六进制 | Integer.toHexString(int i) |
十进制转成八进制 | Integer.toOctalString(int i) |
十进制转成二进制 | Integer.toBinaryString(int i) |
十六进制转成十进制 | Integer.valueOf("FFFF",16).toString() |
八进制转成十进制 | Integer.vakueOf("376",8).toString() |
二进制转成十进制 | Integer.vakueOf("1011",2).toString() |
五,java中的数据类型
二进制 在跨平台中用得比较多 如:文件读写,数据通信
java 语言中基本数据类型
int 类型
byte 1个字节 8位 short 2个字节 16位
int 4个字节 32位 11(1011)<<=44 11(0000 0000 0000 0000 0000 0000 0000 1011)32bit
long 8个字节 64位
浮点型数据类型
单精度(32bit 4个字节 float)、双精度(64bit doble)
bolean类型的取值类型 true 、false
char 数据类型 Unicode 字符 16bit
对应得类类型
Integer、Float、Boolean、Character、Double、Short、Byte、Long
数据类型 转化 字节
例 8143(00000000 00000000 00011111 11001111)
=> byte[] b=[-49,31,0,0];
第一个(低端) 字节 8143>>0*8 &oxff=(11001111)=207 (或者有符号 -49);
第二个(低端) 字节 8143>>1*8 &oxff=(00011111)=31 ;
第三个(低端) 字节 8143>>2*8 &oxff=(00000000)=0 ;
第四个(低端) 字节 8143>>3*8 &oxff=(11001111)=0 ;
大小端
小端法(little-Endian)
低位字节排放在内存的低 地址端 即该地址值的起始地址,高位字节排放在内存的高地址端
大端法(Big-Endian)
高位字节排放在内存的低 地址端 即该地址值的起始地址,低位字节排放在内存的高地址端
例 :32bit宽的数 0x12 34 56 78
在 little-Endian 模式的CPU内存中的存放方式
内存地址 | 0X4000 | 0X4001 | 0X4002 | 0X4003 |
---|---|---|---|---|
存放内容 | 0X78 | 0X56 | 0X34 | 0X12 |
参考文章
位运算的威力
http://blog.scdn.net/iukey/article/details/7195265
大小端详解
http://blog.scdn.net/zhaoshuzhaoshu/article/details/37600857