需求:对给定的数26,获取其十六 进制的表现形式。
思路:
1.啥是十六进制,数据的一种表现形式,好处在于可以表现形式更短。
原理:将二进制中4位为一个十六进制位。
2.原来就是对给定的整数进行二进制的每4位的获取
3.咋获取每4位呢?其实就是获取四位中的1,可以通过&位运算的方式完成。
4.而且想要获取下四位,可以通过对源数据进行无符号右移方式。
步骤:
1.定义变量记录该整数
2.对该变量进行&运算,既然是获取四位,就&四个1,二进制四个1就是十进制的15,
3.对源数据进行无符号右移四位。
class Demo
{
public static void main(String args[]){
int num = 26;
//&15,获取最低四位。
int n1 = num & 15;
System.out.println("n="+(char)(n-10+'a'));
//对num进行右移
num = num >>> 4;
//在进行&15
int n2 = num & 15;
System.out.println("n2="+n2);
}
}
以上动作不合适:
运算很重复,到底&15的结果是否需要做这个字母转换,无法确定,只能求出给定数的十六进制,所以需要语句来完成。
通过循环,完成重复的运算。
通过if完成是否需要字母的判断。
改良:
public class Demo {
public static void main(String[] args) {
int num = 26;
String s = "";
for(int x=1 ; x<9; x++){
int n = num & 15;//先进行&运算求出后4位
if(n>9){
s = (char)(n-10+'a')+s;
System.out.println((char)(n-10+'a'));
}
else{
s = n+s;
System.out.println(n);
}
num = num >>> 4;//无符号右移得出的后四位移走,继续循环求下一个四位
}
System.out.println("0x"+s);
}
}
数组版+去零版:
把计算出的每一位数当做字符按照顺序存储进字符数组,
额外定义一个方法用来输出字符数组中的字符并与字符串相连接,构成完整十六进制。
public class Demo {
public static void main(String[] args) {
int num = 31;
String s = toHex(num);
System.out.println(s);
}
public static String toHex(int num){
//定义容器,存储字符,长度为8,一个整数最多8个十六进制位
char[] chs = new char[8];
//定义一个用于操作数组的索引
int index = chs.length;
while(num!=0){
int n = num & 15;
if(n>9){
chs[--index]=((char)(n-10+'a'));
}
else{
chs[--index]=((char)(n+'0'));
}
//计算下一个四位
num = num >>> 4;
}
System.out.println("index="+index);
return "0x"+toString(chs,index);
}
//定义一个功能将字符数组转化成字符串
public static String toString(char[] chs, int index) {
String s = "";
for(int i = index;i<chs.length;i++){
s = s+chs[i];
}
return s;
}
}
终结版:
需求:十进制–>十六进制,终结版。
思路:
十进制转成十六进制的每一位都是十六进制元素中的某一个。
十六进制元素有很多固定的个数,而且还有对应的编号。
所以可以用传说中的查表法!
其实就是把十六进制的每一位都存入一个字符数组,利用索引直接获取数组中字符
class Noname
{
public static void main(String args[]){
int num = 60;
String s = toHex(num);
System.out.println(s);
}
public static String toHex(int num){
//1.建立表
char[] chs = {'0','1','2','3'
,'4','5','6','7'
,'8','9','a','b'
,'c','d','e','f'};
//2.创建临时容器
char [] arr = new char[8];
//3.创建操作临时容器的索引
int index = arr.length;
//4.通过循环对num进行 & >>>登操作
while(num!=0){
//5.对num进行&操作
int temp = num & 15;
//6.根据运算后的结果作为索引查表,获取对应的字符,并将字符存储到临时容器中
arr[--index] = chs[temp];
//7.对num进行右移
num = num >>> 4;
}
return "0x"+toString(arr,index);
}
//定义一个功能将字符数组转化成字符串
public static String toString(char[] chs, int index) {
String s = "";
for(int i = index;i<chs.length;i++){
s = s+chs[i];
}
return s;
}
}
十进制转八进制,十六进制都是一个道理:先通过&运算获取每一位的值,在进行右移运算循环获取下一个相应的(八,十六)进制位
只不过是十六进制要&15,八进制要&7,二进制要&1,十六进制要右移4位,八进制要右移3位二进制要右移1位。
这里还是演示一下十进制转其他进制的代码吧:
class Demo
{
public static void main(String args[]){
int num = 60;
String str_hex = toHex(num);
String str_binary = toBinary(num);
String str_octal = toOctal(num);
System.out.println(str_hex);
System.out.println(str_binary);
System.out.println(str_octal);
}
//十进制-->十六进制
public static String toHex(int num){
String s = trans(num,15,4);
return "0x"+s;
}
//十进制-->二进制
public static String toBinary(int num){
String s = trans(num,1,1);
return s;
}
//十进制-->八进制
public static String toOctal(int num){
String s = trans(num,7,3);
return "0"+s;
}
public static String trans(int num,int base,int offect){
//1.建立表
char[] chs = {'0','1','2','3'
<span style="white-space:pre"> </span>,'4','5','6','7'
,'8','9','a','b'
,'c','d','e','f'};
//2.创建临时容器
char [] arr = new char[32];
//3.创建操作临时容器的索引
int index = arr.length;
//4.通过循环对num进行 & >>>登操作
while(num!=0){
//5.对num进行&操作
int temp = num & base;
//6.根据运算后的结果作为索引查表,获取对应的字符,并将字符存储到临时容器中
arr[--index] = chs[temp];
//7.对num进行右移
num = num >>> offect;
}
return toString(arr,index);
}
//定义一个功能将字符数组转化成字符串
public static String toString(char[] chs, int index) {
String s = "";
for(int i = index;i<chs.length;i++){
s = s+chs[i];
}
return s;
}
}
只要记住&和右移(>>)这两个操作一切都OK啦…
//小玩意:制表符,用来对齐
for(int i = 1; i < 10; i++){
for(int y = 1; y < i; y++){
System.out.print(y+"*"+i+"="+i*y+"\t");// \t制表符,可以对齐,美观
}
System.out.println();
}
//Windows: \r\n换行
//Linux,Unix: \n换行