数据存储方式

众所周知,java中的数据都是以二进制的形式存储在计算机中的,但是我们看到的数据怎么是10进制的,因为java提供了很多进制自动转换的方式。

位移

向左位移是*2的幂次,一般都是正数操作,右侧补0,所以不存在有符号左位移

向右位移会存在负数,所以存在有符号和无符号右移的问题,左侧补0.

public class Binary {
public static void main(String[] args) {
//转换成2进制,用Integer.toBinaryString()
//转换成16进制,用Integer.toHexString()
int i = 89;
System.out.println(Integer.toBinaryString(i));
//parseInt()
int a = Integer.parseInt("232");
System.out.println(a);
System.out.println(Integer.toBinaryString(a));
System.out.println(Integer.toHexString(a));
/**
* ~: 0-->1 1-->0
* 注意:00000001 ---> 11111110
*/
System.out.println(~a);
System.out.println(Integer.toHexString(~a));
int n;
int m;
/**
* | 或
*
* 0 | 0 = 0
* 0 | 1 = 1
* 1 | 0 = 1
* 1 | 1 = 0
*
* 常用于数据的拼接
*/
// n = 00000000 00000000 00000000 10100010
// m = 00000000 00000000 10111000 00000000
// i = 00000000 00000000 10111000 10100010
n = 0xa2;
m = 0xb800;
i = n | m; // 0xb8a2;
System.out.println(Integer.toHexString(i));
/**
* & 与
*
* 0 & 0 = 0
* 0 & 1 = 0
* 1 & 0 = 0
* 1 & 1 = 1
*
* 常用语拆分截取数据
*
* n = 00000000 00000000 00110100 10110101
* m = 00000000 00000000 00000000 11111111
* i = 00000000 00000000 00000000 10110101
*/
n = 0x34b5;
m = 0xff;
i = n & m; //0xb5;
System.out.println(Integer.toHexString(i)); /**
* >>> 逻辑右移
* n = 01010001 11000000 00000010 01011111
* n>>>1 = 001010001 11000000 00000010 0101111 1(右移后去掉,高位补0)
*
* n = 10100000 10110101 00101100 00100010
* c1 = 11111111 00000000 00000000 00000000
* c2 = 00000000 11111111 00000000 00000000
* c3 = 00000000 00000000 11111111 00000000
* c4 = 00000000 00000000 00000000 11111111
*/
int b1,b2,b3,b4;
n = 0xa0b52c22;
//截取
//拆分成byte
b1 = (n>>24) & 0xff;
b2 = (n>>16) & 0xff;
b3 = (n>>8) & 0xff;
b4 = n & 0xff;
System.out.println(Integer.toHexString(b1));
System.out.println(Integer.toHexString(b2));
System.out.println(Integer.toHexString(b3));
System.out.println(Integer.toHexString(b4));
//拼接
//byte组合成int
n = b4 | (b3<<8) | (b2<<16) | (b1<<24);
System.out.println(Integer.toHexString(n));
/**
* >>:正数的时候高位为0 >>补0
* 负数的时候高位为1 >>补1
* 以0开头的肯定是正数,以1开头的肯定是负数
*/
/**
* <<:左移
* 10进制中移动一位相当于源数据*10
* 2进制中移动一位相当于源数据*2
* 2<<1 = 2*2
* 2<<2 = 2*4 = 2*(2*2)
* 2<<3 = 2*8 = 2*(2*2*2)
* 20<<1 = 20*2
* 20<<2 = 20*4 = 20*(2*2)
*
* 位移n,相当于2的n次幂
*/
System.out.println(2<<3); //2*2*2*2=16
System.out.println(50<<4); //50*2*2*2*2=800
}
}

进制转换

  • 字节转10进制

    直接使用(int)类型转换。
/*
* 字节转10进制
*/
public static int byte2Int(byte b){
int r = (int) b;
return r;
}
  • 10进制转字节

    直接使用(byte)类型转换。
/*
* 10进制转字节
*/
public static byte int2Byte(int i){
byte r = (byte) i;
return r;
}
  • 字节数组转16进制字符串

    对每一个字节,先和0xFF做与运算,然后使用Integer.toHexString()函数,如果结果只有1位,需要在前面加0
/*
* 字节数组转16进制字符串
*/
public static String bytes2HexString(byte[] b) {
String r = ""; for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
r += hex.toUpperCase();
} return r;
}
  • 16进制字符串转字节数组

    这个比较复杂,每一个16进制字符是4bit,一个字节是8bit,所以两个16进制字符转换成1个字节,对于第1个字符,转换成byte以后左移4位,然后和第2个字符的byte做或运算,这样就把两个字符转换为1个字节。
/*
* 字符转换为字节
*/
private static byte charToByte(char c) {
return (byte) "0123456789ABCDEF".indexOf(c);
} /*
* 16进制字符串转字节数组
*/
public static byte[] hexString2Bytes(String hex) { if ((hex == null) || (hex.equals(""))){
return null;
}
else if (hex.length()%2 != 0){
return null;
}
else{
hex = hex.toUpperCase();
int len = hex.length()/2;
byte[] b = new byte[len];
char[] hc = hex.toCharArray();
for (int i=0; i<len; i++){
int p=2*i;
b[i] = (byte) (charToByte(hc[p]) << 4 | charToByte(hc[p+1]));
}
return b;
} }
  • 字节数组转字符串

    直接使用new String()
/*
* 字节数组转字符串
*/
public static String bytes2String(byte[] b) throws Exception {
String r = new String (b,"UTF-8");
return r;
}
  • 字符串转字节数组

    直接使用getBytes()。
/*
* 字符串转字节数组
*/
public static byte[] string2Bytes(String s){
byte[] r = s.getBytes();
return r;
}
  • 16进制字符串转字符串

    先转换成byte[],再转换成字符串。
/*
* 16进制字符串转字符串
*/
public static String hex2String(String hex) throws Exception{
String r = bytes2String(hexString2Bytes(hex));
return r;
}
  • 字符串转16进制字符串

    先转换为byte[],再转换为16进制字符串。
/*
* 字符串转16进制字符串
*/
public static String string2HexString(String s) throws Exception{
String r = bytes2HexString(string2Bytes(s));
return r;
}

main函数:

public static void main(String[] args) throws Exception{
byte b1 = (byte) 45;
System.out.println("1.字节转10进制:" + byte2Int(b1)); int i = 89;
System.out.println("2.10进制转字节:" + int2Byte(i)); byte[] b2 = new byte[]{(byte)0xFF, (byte)0x5F, (byte)0x6, (byte)0x5A};
System.out.println("3.字节数组转16进制字符串:" + bytes2HexString(b2)); String s1 = new String("1DA47C");
System.out.println("4.16进制字符串转字节数组:" + Arrays.toString(hexString2Bytes(s1))); System.out.println("5.字节数组转字符串:" + bytes2String(b2)); System.out.println("6.字符串转字节数组:" + Arrays.toString(string2Bytes(s1))); System.out.println("7.16进制字符串转字符串:" + hex2String(s1)); String s2 = new String("Hello!");
System.out.println("8.字符串转16进制字符串:" + string2HexString(s2));
}

运行结果:

字节转10进制:45
.10进制转字节:89
.字节数组转16进制字符串:FF5F065A
.16进制字符串转字节数组:[29, -92, 124]
.字节数组转字符串:?_Z
.字符串转字节数组:[49, 68, 65, 52, 55, 67]
.16进制字符串转字符串:?|
.字符串转16进制字符串:48656C6C6F21

java字节、位移以及进制转换的更多相关文章

  1. HexDump.java解析,android 16进制转换

    HexDump.java解析android 16进制转换 package com.android.internal.util; public class HexDump { private final ...

  2. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  3. Java语言发展史-计算机进制转换

    Java语言发展史 java的诞生 在1991年时候,James Gosling在Sun公司的工程师小组想要设计这样一种主要用于像电视盒这样的消费类电子产品的小型计算机语言. 这些电子产品有一个共同的 ...

  4. 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符

    02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...

  5. java中常用的进制转换

    十进制转成十六进制:   Integer.toHexString(int i)   十进制转成八进制   Integer.toOctalString(int i)   十进制转成二进制   Integ ...

  6. IT兄弟连 Java语法教程 数据类型 进制转换

    ●  正十进制转换为二进制 拆分法,将十进制整数拆分为若干个二进制权重的和,若有该权重则下面写1,否则写0.如: 34 = 32 + 2 128 64 32 16 8 4 2 1 0  0  1  0 ...

  7. 【Java】7.0 进制转换

    [二进制转十进制] public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.p ...

  8. 【九度OJ】题目1138:进制转换 解题报告

    [九度OJ]题目1138:进制转换 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1138 题目描述: 将一个长度最多为30 ...

  9. 最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类

    前言:用于处理Java基本数据的转换及进制转换操作工具 一.实现功能 1.int与byte互转 2.int与byte[]互转 3.short与byte互转 4.short与byte[]互转 5.16位 ...

  10. java se系列(二) 关键字、注释、常量、进制转换、变量、数据类型转换、运算符

    1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2 常见的关键字 备注 ...

随机推荐

  1. [转帖]使用Linux命令快速查看某一行

      原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 当年,我还是Linux菜鸟的时候,就在简历上写着精通Linux命令了,而当面试官问我"如何快速查看 ...

  2. 【0基础学爬虫】爬虫基础之自动化工具 Selenium 的使用

    大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶.逆向相关文章,为实现从易到难全方位覆盖,特设[0基础学爬 ...

  3. 从零开始配置vim(30)——DAP的其他配置

    很抱歉这么久才来更新这一系列,主要是来新公司还在试用期,我希望在试用期干出点事来,所以摸鱼的时间就少了.加上前面自己阳了休息了一段时间.在想起来更新就过去一个多月了.废话不多说了,让我们开始进入正题. ...

  4. .net ELk 成功使用

    原文地址: http://t.zoukankan.com/shousiji-p-15222276.html

  5. ABC311_g One More Grid Task 题解

    题目链接:Atcoder 或者 洛谷 对于解决二维区间内的最值类型问题,我们常常有一类特别好用的方法,就是悬线法,它可以看做是单调栈的子集,但更加好理解和书写. 对于悬线法,我们有一个常见的模型,找出 ...

  6. P7907 [Ynoi2005] rmscne题解

    题目链接:rmscne 神仙经典数据结构难题.看到求区间种类数有关的东西,需要下意识的反应到经典老题 HH的项链,这里可以学习我这篇 题解.具体学习下扫描线怎么做这类东西的. 看看本题,首先处理区间查 ...

  7. Git 简明教程(一)

    版本控制工具,早期的vss tfs svn等,这些应该是老一辈程序员常用的工具.目前 git 已经在版本控制领域占主流的地位,因为国外的github 和国内的码云 gitee 均用的是git. git ...

  8. 24.3 向量化异常VEH--《Windows核心编程》

    Windows 提供了向量化异常处理(vectored excepation handing,VEH)机制.程序可以注册一个函数,每当异常发送或者一个未处理异常脱离标准SEH的控制时,这个函数就会被调 ...

  9. Linux Shell 字符串截取方法

    Linux 的字符串截取很有用.有八种方法. 假设有变量 var=http://www.aaa.com/123.htm. 1. # 号截取,删除左边字符,保留右边字符. 代码如下: echo ${va ...

  10. Python_json类方法

    Python_json类方法 import requests import json headers = { "User-Agent": "Mozilla/5.0 (Li ...