黑马程序员-位与进制转换
来源:互联网 发布:淘宝卖家帐号被冻结 编辑:程序博客网 时间:2024/05/22 10:59
1.进制的理解:
进制就是进位制
X进制: 逢X进1
进制一共分为 二进制(binary),十进制,八进制(octal),十六进制(hex)
2.二进制
二进制的特点:由0和1组成,逢2进1
使用运算来表示的话就是 0+0=0 0+1=1 1+1=10
如何由十进制转换成二进制?
除2运算,余数取反
将该十进制数不停的去除2,得到的余数取反的结果即为二进制数
那么如何从十进制转换成二进制呢?
原理是: 乘二的次幂
其中,一个字节是八个位,所以它最大数为128+64+32+16+8+4+2+1 = 255
3.八进制
逢8进1
由三个二进制位表示一个八进制
并且表示的时候前面要加一个0
十进制转八进制: 除八取余 并取反 与二进制是一样的过程
二进制如何转八进制?
90的二进制形式是 01011010
第一步: 将其改成三个三个的形式,因为一个八进制是三个二进制来表示,如果不足三位的可以补0
001 011 010
第二步 : 得出他们的二进制数值 由此可以得出一个结论:为什么要使用三个二进制来表示一个八进制,因为三个二进制的最大值为 1+2+4=7 不会超过8
1 3 2
第三步: 别忘了在前面加上0表示八进制
0132
4.十六进制
逢16进1
由四个二进制位代表一个十六进制
表示十六进制要在前面加上0x的前缀
十进制和十六进制之间的转换和二进制八进制原理是一样的
二进制转十六进制
90的二进制形式 01011010
第一步: 将四个二进制分割开。
0101 1010
第二步: 得出他们的二进制数值
0101 = 5
1010 = 10
十六进制的数有个特点,9以上为了避免10 11 这种写法使用ABCD这样的形式
所以最后得出的是5A
第三步:加上0x前缀
得出的结果是0x5A
5.负数二进制:整数的二进制取反+1
比如 取-6的二进制
第一步: 得出6的二进制
因为6是整数,整数是四个字节,也就是32位
所以6的二进制:
00000000 00000000 00000000 00000110
第二步: 正数的二进制取反 得到反码,可以用符号~
11111111 11111111 11111111 11111001
第三步: 反码+1 得到补码
11111111 11111111 11111111 11111001
+ 00000000 00000000 00000000 00000001
-------------------------------------------------------------------
11111111 11111111 11111111 11111010
由上述的二进制可以得出一般的规律: 负数二进制的最高位为1,正数为0
5.位运算符详解
与 &
或 |
非 !
异或 ^
实质上 每移动一位就是对这个二进制数的十进制形式乘以或者除以2
左移 << 乘以2的移动位数次幂
左移途中,会碰到右边空出位数的情况,这时右边补0
右移 >> 除以2的移动位数次幂
右移途中,会碰到左边空出位数的情况,这时左边看情况补
如果最高位为1,则补1 如果为0,则补0
无符号右移 >>> 因为是无符号,所以空出来的用0来补
& | ! 一定要区分开,逻辑运算符得出的结果一定是true或者false
而位运算符则是进行位的运算,可以将true看做1,false看做0
110
&011
---------
010
如果一个数异或一个数连续异或两次,结果还得这个数
7^4^4=7
位运算的例子:
最有效率的求出2乘以8
第一步:确定要运算的数字 2和8
第二步: 确定运算方式为乘法,即左移
第三步: 确定要左移的位数: 3
异或的应用:
对两个整数变量进行互换(不使用第三方变量)
1.n = n + m;
m = n - m ;
n = n - m;
这种方式容易损失精度,因为每个类型都有其最大值,容易超出精度
2.
n = n ^ m;
m = n ^ m
n = n ^ m;
6.进制转换代码
/*
查表法进制转换
*/
class ArrayTest
{
public static void main(String[] args)
{
//函数入口
toHex(60);
//公用进制转换方法
public static void trans(int num,int base,int offset)
{
//因为0的任何转换形式都为0
if (num == 0)
{
System.out.println(0);
return ;
}
//定义一个表,因为最高的转换是十六进制
//所以让这个字符数组存储十六进制的数值
//如果要转换二进制,则只需要取数组中前两位
//如果要转换八进制,则只需要取数组中前八位
//如果要转换十六进制,则只需要取数组中前八位
char[] chs = {'0','1','2','3','4',
'5','6','7','8','9',
'A','B','C','D','E','F'};
//定义临时容器
char[] arr = new char[32];
int pos = arr.length ;
while (num != 0)
{
//2的八进制可以用另一种形式,即&7
//算法:进制转换就是将要转换的进制数 & 要转换的进制-1(八进制即为7)
//所以base的值通常只有三个,1,7,15
int temp = num & base;
// 因为pos是数组的长度,所以要取角标的话,需要将本身的值-1得到数组的最大值。避免角标越界异常
// -- : 自减运算符 先将这个值进行-1再去做其他操作。
arr[--pos] = chs[temp];
//offset为转换进制的2的次幂数
num = num >>> offset;
}
for (int x = pos; x < arr.length ; x++ )
{
System.out.print(arr[x]);
}
}
/*
十进制-》二进制
*/
public static void toBin(int num)
{
trans(num,1,1);
}
/*
十进制-》八进制
*/
public static void toBa(int num)
{
trans(num,7,3);
}
/*
十进制-> 十六进制
*/
public static void toHex(int num)
{
trans(num,15,4);
}
}
7.java所提供的进制转换方法
1.static String toBinaryString(int i)
2.static String toOctalString(int i)
3.static String toHexString(int i)
此方法为静态,并且返回String类型,是Integer类中的方法。使用方法 String str = Integer.toBinaryString(30);
- 黑马程序员-位与进制转换
- 黑马程序员——ios开发基础之C语言之进制转换、位运算与内存管理
- 黑马程序员---进制转换
- 黑马程序员-进制转换
- 黑马程序员--进制转换
- 黑马程序员------进制转换
- 黑马程序员——Java基础语法:利用位运算实现的基础进制转换
- 黑马程序员07——C语言之进制使用与位运算
- 黑马程序员5--进制转换问题
- 黑马程序员——进制转换
- 黑马程序员_java 进制转换
- [黑马程序员]进制转换学习笔记
- 《黑马程序员》 进制转换优化
- 黑马程序员:查表法解决进制转换
- 黑马程序员-进制转换优化代码
- 黑马程序员--Java进制的转换
- 黑马程序员_java进制转换
- 黑马程序员-----c语言基础与重点第二篇——进制转换与数组
- hdoj.1029 Ignatius and the Princess IV 20140809
- 蟒蛇比Perl的的优点与缺点
- springMvc如何和前端页面交互,传输json数据
- leetcode-reverse words in a string
- 线程异常
- 黑马程序员-位与进制转换
- 文件内存映射mmap解决大文件快速读写问题和进程间共享内存
- linux进程通信(一)--共享内存+信号量,代码示例
- poj 2488 A Knight's Journey (Dfs)
- openGL 顶点,坐标系,纹理坐标
- 《算法之道》精华 算法设计部分
- 黑马程序员_面向对象的三个基本特征
- [Android实例] 同一个session通信的解决方案
- ORACLE里边的单行函数