十六进制与二进制对应关系(二进制与十六进制)

十进制(最能理解的帮助大家熟悉进制规则)

逢10进1的计数规则,日常中我们使用最多的计数方法

  • 规则:逢10进1
  • 数字只有:0 1 2 3 4 5 6 7 8 9
  • 基数:10
  • 权:... 10^5(十万) 10^4(万) 10^3(千) 10^2(百) 10^1(十) 10^0(个)

eg: 14 = 1*10^1 4*10^0 ; 114 = 1*10^2 1*10^1 4*10^0

十六进制与二进制对应关系(二进制与十六进制)(1)

十进制,每个珠子代表对应权的值

二进制(计算机采用的数制

逢2进1的计数规则,计算机中的变量/常量都是按照2进制来运算的

  • 规则:逢2进1
  • 数字只有:0 1
  • 基数:2
  • 权:... 2^5 2^4 2^3 2^2 2^1 2^0

十六进制与二进制对应关系(二进制与十六进制)(2)

4位 2进制做对比

  • 十进制转二进制:

十六进制与二进制对应关系(二进制与十六进制)(3)

10进制转换成2进制,计算如上图

  • 二进制转为十进制:将一个2进制数每个1位置的权值相加即可

举例:0101 = 1*2^2 1*2^0 =5

十六进制与二进制对应关系(二进制与十六进制)(4)

二进制,每个珠子代表对应权值

十六进制

逢16进1的计数规则,因为2进制书写太麻烦,所以常常用16进制来缩写2进制数字

  • 规则:逢16进1
  • 数字只有:0 1 2 3 4 5 6 7 8 9 a b c d e f 其中:A~F表示10~15
  • 基数:16
  • 权:... 16^5 16^4 16^3 16^2 16^1 16^0

为了更好的让机器识别十六进制,使用“0x”开头为表示十六进制。

举例:0x1234--------1个4096 2个256 3个16 4个1 = 4660

八进制 (重点:为了区别各种进制:八进制以0开头)

  • 规则:逢8进1
  • 数字只有:0 1 2 3 4 5 6 7
  • 基数:8
  • 权:... 8^5 8^4 8^3 8^2 8^1 8^0

举例:034--------3个8 4个1 =28

进制相互转换

//二进制转十进制 0101 = 0*2^3 1*2^2 0*2^2 1*2^0 =5 //八进制转十进制 037 = 0*8^2 3*8^1 9*8^0 =31 //十六进制转十进制 0x1f = 1*16^1 15*16^0 = 31 //如何缩写:将2进制从最低位开始,每4位2进制缩写为1位 就是16进制 //4位2进制 8 4 2 1 权 0 1 0 1 二进制4位 //每4位缩成1位 变成16进制 16进制: 4 f 0 5 7 a f e 二进制:0100 1111 0000 0101 0111 1010 1111 1110 = 0x4f057afe 16进制: f f 二进制:1111 1111 = 0xff 16进制: 6 1 4 f 7 b b b //16转2进制,每位转成4位2进制 2进制: 0110 0001 0100 1111 0111 1011 1011 1011 16进制: 3 2 //16转2进制,每位转成4位2进制 2进制:0000 0000 0000 0000 0000 0000 0011 0010

补码(4位二进制为例)

计算机中处理有符号数(正负数)的一种编码方式,java中的补码最小类型是int,32位数

  • 补码的编码规则:
  1. 计算的时候如果超出4位数就自动溢出舍弃,保持4位数不变
  2. 将4位2进制的数分一半作为负数使用
  3. 最高位称为符号位,高位1代表负数,高位0代表正数

十六进制与二进制对应关系(二进制与十六进制)(5)

绿线,超过就补码

int n = -3; //打印十进制 System.out.println(n); //打印二进制方法 System.out.println(Integer.toBinaryString(n)); //补码规律: 如上图 /* 1) 0111为四位补码的最大值,规律是1个0和3个1,可以推导出: 32位int型 补码最大值是 1个0和31个1-----(011111111...) 2) 1000 为四位补码的最小值,规律是1个1和3个0,可以推导出: 32位int型 补码最小值是 1个1和31个0 ------(10000000....) 3) 1111为补码的-1,规律是4个1,可以推导出: 32位int型 的-1 是32个1 -------(111111111...) 最大值加一 变成最小值,如图就很清楚了,因为它是一个圆,最大值挨着的就是最小值 eg: 0111 加1 变成 1000 但是存在补码,所以就变成了最小值 */ int max = 2147483647; //打印int 最大值的二进制 System.out.println(Integer.toBinaryString(max)); //打印 最大值加1 是否变成最小的值 System.out.println(Integer.toBinaryString(max 1));

  • 二进制负数的理解:
  1. 记住int型 -1的编码是32个1
  2. 用-1 减去0位置的对应权值。是计算负多少数的计算方法【正数:累加计算1位置的对应权值】

//int型 -1 如下 1111 1111 1111 1111 1111 1111 1111 1111 ======-1 //计算是用-1 减去0位置的对应权值 1111 1111 1111 1111 1111 1111 1111 1101 ======-1-2 = -3 1111 1111 1111 1111 1111 1111 1111 1001 ======-1-4-2 = -7 1111 1111 1111 1111 1111 1111 1001 0111 ======-1-8-32-64 =-105 //以上就是负数的计算 是看0位置的权值

互补对称

  1. 公式:-n =~n 1
  2. 结论:一个数的补码=这个数取反 1

十六进制与二进制对应关系(二进制与十六进制)(6)

补码图

//取反 二进制: 0010 取反 1101 然后加1 变成1110 // 2取反-2 二进制:1001 取反 0110 然后加1 变成0111 // -7取反为7 // 取反 1变成0 ,0变成1

位运算

~取反(见:上面互补对称)

& 与运算 (有0则0)

//规则 0 & 0 =0 0 & 1 =0 1 & 0 = 0 1 & 1 = 1 //权 7 b b b n = 01111011 1011 1011 m = 00000000 1111 1111 = 0xff k = n&m 00000000 1011 1011 // 位置对上 1 & 1 =1 其余都是0 就可以得出答案

| 或运算 (有1则1)

//规则 0 | 0 =0 0 | 1 =1 1 | 0 = 1 1 | 1 = 1 //权 7 b b b n = 01111011 1011 1011 m = 00000000 1111 1111 = 0xff k = n&m 01111011 1111 1111 // 位置对上 0 | 0 =0 其余都是1 就可以得出答案

>>> 右移位运算

规则:将2进制数整体向右移动,低位自动溢出舍弃,高位补0

<< 左移位运算

规则:将2进制数整体向左移,高位溢出舍弃,低位补0

注:位运算符和乘2 除2 在大多数时候是很相似的,可以进行替代,同时效率也会高的多,但是两者切记不能混淆 ;不能单纯理解就是乘2 或者 除2

十六进制与二进制对应关系(二进制与十六进制)(7)

位移运算图

二进制运算

// 加运算: // 0 0=0,0 1=1,1 0=1,1 1=10,(逢2进1); // 减运算: // 1-1=0,1-0=1,0-0=0,0-1=1,(向高位借1当2); // 乘运算: // 0×0=0,0×1=0,1×0=0,1×1=1,(只有同时为“1”时结果才为“1”); // 除运算:(二进制数只有两个数(0,1),因此它的商是1或0) // 0÷1=0,1÷1=1 eg: 10100 - 1010 = 1010 // 10100 // -1010 // ——————————(不够就向前借1,当作2在计算) // 1010

学习记录,参考于blog.csdn.net/jason13579

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页