数据存储方式

众所周知,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. echarts定义饼状图的指向线内容

    定义饼状图的指向线内容 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  2. STM32CubeMX教程26 FatFs 文件系统 - W25Q128读写

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...

  3. 百度飞桨:ERNIE 3.0 、通用信息抽取 UIE、paddleNLP的安装使用[一]

     相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨: ...

  4. 4.2 Inline Hook 挂钩技术

    InlineHook 是一种计算机安全编程技术,其原理是在计算机程序执行期间进行拦截.修改.增强现有函数功能.它使用钩子函数(也可以称为回调函数)来截获程序执行的各种事件,并在事件发生前或后进行自定义 ...

  5. LyScript 实现Hook改写MessageBox

    LyScript 可实现自定义汇编指令的替换功能,用户可以自行编写一段汇编指令,将程序中特定的通用函数进行功能改写与转向操作,此功能原理是简单的Hook操作. 插件地址:https://github. ...

  6. git操作 手写稿

  7. 手撕B树 | 二三查找树,B+树B*树你都会了吗? | 超详细的数据结构保姆级别实现

    说在前面 今天给大家带来B树系列数据结构的讲解! 博主为了这篇博客,做了很多准备,试了很多画图软件,就是为了让大家看得明白!希望大家不要吝啬一键三连啊!! 前言 那么这里博主先安利一下一些干货满满的专 ...

  8. Softmax偏导及BP过程的推导

    Softmax求导 其实BP过程在pytorch中可以自动进行,这里进行推导只是强迫症 A Apart证明softmax求导和softmax的BP过程 本来像手打公式的,想想还是算了,引用部分给出la ...

  9. STM32 HAL库 USART DMA驱动

    前言 本文是在使用 STM32L4 的串口 DMA 功能时,使用 HAL 库出现的一些问题,通过以下方式解决了 HAL 库中存在 DMA 发送和接收的一些问题. STM32L4 的 DMA 简介 DM ...

  10. 《ASP.NET Core 微服务实战》-- 读书笔记(第11章)

    第 11 章 开发实时应用和服务 在本章,我们将讨论"实时"的准确含义,以及在大部分消费者看来应该属于这一范畴的应用类型 接着,我们将探讨 WebSocket,并分析为什么传统的 ...