Java基础-二进制以及字符编码简介

                                    作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  想必计算机毕业的小伙伴或是从事IT的技术人员都知道数据存储都是以二进制的数字存储到硬盘的。从事开发的兄弟们对二进制估计也再熟悉不过了。但是现实生活中我们都是知其然不知其所以然。这也是我在学习大数据之前对二进制的迷茫,就说Java中关于byte和int两种不同的数据类型吧,byte是字节类型,一个字节等于八个比特位,int是整数型,它占用了四个字节,共计32个比特位。那么你对二进制确定了解的很透彻吗?比如“-1”是如何通过二进制表示的,为什么一个字节的取值范围是“-128~127”,为什么在二进制中“0”是正数?“-128”是如何表示的呢?如果你对这些还没有了解透彻,我们可以一起来探讨一下。

 

一.计算机只能识别“0”和“1”

  在计算机中,所有的数据都是以“0”和“1”的形式存在的,比如CPU,内存,硬盘中的数据都是“0”和“1”。话句话说,计算机只能识别“0”和“1”,因为计算机是由数字逻辑电路设计成的,电路只有通电和断电两种稳定的状态,就用“0”和“1”来表示这两种状态。

  在计算机中存储一个“0”或“1”,需要使用一个比特位(bit),一个字节(byte)字节表示8个二进制位。做大数据的小伙伴,电脑的标配内存建议是32G,你们32Gbyte是多少字节呢?(32GByte = 32*1024Mbyte = 32*1024*1024Kbyte = 32*1024*1024*1024Byte)。

二.简介二进制

1>.什么是二进制

  二进制是计算技术中广泛采用的一种数制二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。

2>.如何用二进制表示数字“8”

  综上图:我们可以看出数字“8”用二进制表示为:“00001000”。

3>.如何用二进制表示数字“-8”

  Java的负数采用补码方式存储,即:取反+1。我们知道正数“8”用二进制表示应为:“00001000”,如果对其取反则为:“10000111”,我们如果在对他进行加“1”操作后的数字应为:“10001000”,所以我们说“-8”用二进制表示则为:"10001000",那么问题来了,“8”和“-8”的相加的和应该是多少呢?相信大家都是心知肚明的,那么我们看看计算机是如何用二进制表示的吧。

  如上图所示:数字“8”和“-8”的相加的和为:“100000000”,很显然,一个字节只能存储8位,所以,我们要把最前面的那个“1”丢弃掉,这样就得到了“00000000”,即8个“0”,因此,“8”+“-8”的值为“0”。现在想想发明二进制算法的人真是牛逼啊!连这样的空隙都想出来了!!

4>.小试牛刀-int和byte类型强制转换

  其实原理很简单,byte类型只有8个bits,最大的值为“-128~127”,其结果如下:

三.字符编码

  字符编码可以把我们输入的汉字等字符转换为对应的“01”序列,还可以把“01”序列转换为对应的字符。

1>.编码

  把字符转换成对应的码值。

2>.解码

  把一个整数转换为对应的字符。

3>.常用的字符编码

  a>.ASCII 编码,美国的标准的信息转换码,仅使用一个字节存储;

  b>.ISO-9959-1 编码,西欧编码,Tomcat服务器默认的编码格式;

  c>.GBK(一个汉字对应2个字节)/GB2312编码,简体中文编码,每个汉字都对应两个字节的“01”序列;

  d>.BIG5(一个汉字对应2个字节),繁体中文编码;

  e>.Unicode 编码,为全世界所有的语言都提供了唯一的编码,有utf-8(一个汉字对应3个字节),utf-16等常用的编码格式。

  f>.UTF-8编码,国际化统一编码,可以表示任何文字。

  注意:任何字符集都是ASCII编码的超集。

4>.乱码

  编码时使用的编码格式与解码时使用的解码格式不一致就会出现乱码。如"尹正杰"三个汉字使用utf-8编码,生成“01”序列为9个字节,如果是用GB2312进行解码,把两个字节的“01”序列翻译为一个汉字,最终解码出来的数据肯定是不正常的。现在你应该明白为什么你下载了一个晚上的小电影,最后用播放器打开的时候提示无法渲染该文件内容,这就是因为播放器不支持你所下载的视频格式。

5>.小试牛刀

  a>.打印出Java中char可以表示的类型

  1. /*
  2. @author :yinzhengjie
  3. Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
  4. EMAIL:y1053419035@qq.com
  5. */
  6.  
  7. package cn.org.yinzhengjie.java;
  8.  
  9. import org.junit.Test;
  10.  
  11. public class CharacterCoding {
  12. //打印出Java中char可以表示的类型
  13. @Test
  14. public void testChar(){
  15. int count = 0;
  16. for (int i = 0x0000;i <= 0xffff;i++){
  17. char res = (char)i;
  18. if (count == 20){
  19. count = 0;
  20. System.out.println();
  21. }
  22. System.out.print(i + ":" + res + " ");
  23. count++;
  24. }
  25. }
  26. }

  b>.对“尹正杰”这个字符串进程编码和解码操作

  1. /*
  2. @author :yinzhengjie
  3. Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
  4. EMAIL:y1053419035@qq.com
  5. */
  6.  
  7. package cn.org.yinzhengjie.java;
  8.  
  9. import org.junit.Test;
  10. import java.nio.charset.Charset;
  11.  
  12. public class CharacterCoding {
  13. @Test
  14. public void testCharset() throws Exception {
  15. String str = "尹正杰" ;
  16. //编码
  17. System.out.println(Charset.defaultCharset().name()); //查看当前操作平台默认的编码格式
  18. byte[] bytes = str.getBytes("unicode") ; //编码的格式以Unicode进行编码
  19.  
  20. //解码
  21. String str2 = new String(bytes, "unicode") ; //解码的格式以Unicode的方式进行解码
  22. System.out.println(str2);
  23. }
  24. }

  c>.找出“尹正杰”这个字符串在Unicode存储的编号

  1. /*
  2. @author :yinzhengjie
  3. Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
  4. EMAIL:y1053419035@qq.com
  5. */
  6.  
  7. package cn.org.yinzhengjie.java;
  8.  
  9. import org.junit.Test;
  10.  
  11. public class CharacterCoding {
  12.  
  13. //找出“尹正杰”对应的unicode编号,不推荐使用!效率低!
  14. @Test
  15. public void searchName(){
  16. for(int i = 0x0000;i<0xffff;i++){
  17. char res = (char)i;
  18. if (res == '尹' || res == '正' || res == '杰'){
  19. System.out.print(i + ":" + res + " ");
  20. }
  21. }
  22. }
  23. //找出“尹正杰”对应的unicode编号,推荐使用!
  24. @Test
  25. public void searchName2(){
  26. int yin = '尹';
  27. int zheng = '正';
  28. int jie = '杰';
  29. System.out.println(yin);
  30. System.out.println(zheng);
  31. System.out.println(jie);
  32. }
  33. }

  d>.定义函数,取出整数内存中的存储形态对应的16进制字符串。

  1. /*
  2. @author :yinzhengjie
  3. Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
  4. EMAIL:y1053419035@qq.com
  5. */
  6.  
  7. package cn.org.yinzhengjie.java;
  8.  
  9. public class CharacterCoding {
  10. /**
  11. * 定义函数,取出整数内存中的存储形态对应的16进制字符串。
  12. */
  13. public static String int2hexStr(int j){
  14. StringBuffer buffer = new StringBuffer();
  15. char[] chars = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',};
  16. for (int i = 0;i<8;i++){
  17. //每次移动不同的位数,然后和0x0f进行“&”运算,目的是为了把前28位的数字都变成0,只截移位后的最后4位,而这最后4位的取值范围恰巧在chars数组中!
  18. char c = chars[j>>(i * 4) & 0x0f];
  19. //每次取值后,将该数据插入到首位
  20. buffer.insert(0,c);
  21. }
  22. return buffer.toString();
  23. }
  24.  
  25. public static void main(String[] args) {
  26. int year = 2018;
  27. String res = int2hexStr(year);
  28. System.out.println(res);
  29. }
  30. }
  31.  
  32. /*
  33. 以上代码执行结果如下:
  34. 000007E2
  35. */

  e>.定义函数,取出整数内存中的存储形态对应的2进制字符串。

  1. /*
  2. @author :yinzhengjie
  3. Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/
  4. EMAIL:y1053419035@qq.com
  5. */
  6.  
  7. package cn.org.yinzhengjie.java;
  8.  
  9. public class CharacterCoding {
  10. /**
  11. * 定义函数,取出整数内存中的存储形态对应的2进制字符串。
  12. */
  13. public static String int2BinaryStr(int j){
  14. StringBuffer buffer = new StringBuffer();
  15. char[] chars = {'0','1'};
  16. for (int i = 0;i<32;i++){
  17. char c = chars[j>>(i * 1) & 0x01];
  18. //每次取值后,将该数据插入到首位
  19. buffer.insert(0,c);
  20. }
  21. return buffer.toString();
  22. }
  23.  
  24. public static void main(String[] args) {
  25. int year = 2018;
  26. String res = int2BinaryStr(year);
  27. System.out.println(res);
  28. }
  29. }
  30.  
  31. /*
  32. 以上代码输出结果如下:
  33. 00000000000000000000011111100010
  34. */

Java基础-二进制以及字符编码简介的更多相关文章

  1. 字符编码简介:ASCII,Unicode,UTF-8,GB2312

    字符编码简介:ASCII,Unicode,UTF-8,GB2312 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和 1两种状态,因 ...

  2. 转载:字符编码简介 ASCII UTF-8 ISO8859-1

    字符编码简介 ASCII UTF-8 ISO8859-1 博客分类: 电脑综合知识 XP数据结构Windows  计算机中的一切都是以数字来表示的,字符同样如此.字符编码就是将字符集编码成为数字序列, ...

  3. 001. Java内存中的字符编码

    Java内存中的字符编码 Unicode字符集及utf-8 .utf-16.utf-32 等字符编码方式 字符集:字符表示的数字集合,元素称为码点或码位: 字符编码:字符实际的储存表示: 码点:一个码 ...

  4. Java基础-日期格式化DateFormat类简介

    Java基础-日期格式化DateFormat类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.DateFormat类概述 DateFormat 是日期/时间格式化子类的抽象 ...

  5. Python编程笔记二进制、字符编码、数据类型

    Python编程笔记二进制.字符编码.数据类型 一.二进制 bin() 在python中可以用bin()内置函数获取一个十进制的数的二进制 计算机容量单位 8bit = 1 bytes 字节,最小的存 ...

  6. Python基础编程:字符编码、数据类型、列表

    目录: python简介 字符编码介绍 数据类型 一.Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心 ...

  7. Java中常用的字符编码-解析

    ASCII字符编码 美国信息互换标准代码,为罗马字母编制的一套编码,主要用于表达现代英语和其他西欧语言中的字符,1字节的7位表示一个字符. ISO-8859-1字符编码 ISO为西欧语言中的字符制定的 ...

  8. 三种常见字符编码简介:ASCII、Unicode和UTF-8

    什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...

  9. [十]基础数据类型之Unicode编码简介

    编码含义 关于编码的含义,之前也说过,计算机只能存储二进制序列 所以对于字符,保存的时候,需要进行编码为二进制,进行存储 呈现的时候,需要将二进制进行解码,转换成字符的形式   有很多种编码方式,比如 ...

随机推荐

  1. 内幕:XX二手车直卖网,狗屁直卖网,我来揭开他们套路!

    转自:明锐论坛   我是一位花生二手车直卖网的离职员工.已离职了一段时间,现在在某家汽车4S店公司上班.过去了那么久,每当看到他们铺天盖地的广告,心里都像十五个水桶--七上八下.思索已久,我还是决定鼓 ...

  2. stl源码剖析 详细学习笔记 hashset hashmap

    //---------------------------15/03/26---------------------------- //hash_set { /* hash_set概述: 1:这是一个 ...

  3. 验证Xpath和CSS 路径是否有效

    XPath定位和CSS定位在Selenium中是经常使用的. 在FireFox浏览器和Chrome浏览器,可以使用这样的方法来验证定位是否准确. 以Chrome浏览器做范例 按键盘的F12 进入开发者 ...

  4. linux/Centos下查看和修改网卡Mac地址(ifconfig命令)

    本文转载自http://www.169it.com/article/14360294838474691537.html linux/Centos下查看网卡Mac地址,输入命令: #ifconfig - ...

  5. 《杜增强讲Unity之Tanks坦克大战》10-相机控制

    10 相机控制 本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内.   image 在Hierarchy点击右键   image 点击 Create Empty,生成空对象,改名 ...

  6. 《Linux内核分析》第四周:扒开系统调用的三层皮

    杨舒雯 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 " 一. 用户 ...

  7. sqlserver附加数据库时,无法打开物理文件 "xx.mdf"。操作系统错误 5:"5

    sqlserver在附加数据库时,提示无法打开物理文件 "xx.mdf".操作系统错误 5:"5 此时可能你是用window验证方式登陆数据库的? 如果是这样,断开连接, ...

  8. 刚做了个实验,验证++和!和printf的先后次序

  9. [转帖]shell 中的>/dev/null 2>&1 是什么鬼?

    shell 中的>/dev/null 2>&1 是什么鬼? http://blog.jobbole.com/109355/ 背景 我们经常能在shell脚本中发现>/dev/ ...

  10. Git从零开始(三)

    一.远程仓库管理 1.将本地内容推送到远程库 先关联远程库,执行命令: git remote add origin https://github.com/Hollydan/gitstore.git ( ...