【干货】小白最容易放弃的二进制详解!

二进制,八进制,十六进制一直困扰着很多小伙伴,今天老九君就给小伙伴们讲解一下进制转化。

在计算机的世界里,只有0和1,也就是二进制。

我们如何把一个十进制的数转成二进制或者其他进制,其实还是很简单的,看下面这张图

十进制转二进制

十进制的123转成二进制就是1111011,转成几进制都是一个道理。

一、二进制

1.1 二进制是计算机采用的表示数字的方式, 每个数位上只有0和1;

1.2 任何整数一定可以采用二进制的方式表示, 小数的二进制这里不多说;

1.3 字节内部采用二进制方式记录数字, 一个字节分成八段, 每个分段有一个编号, 最右边分段编号是0, 向左逐渐递增

1.4 相邻分段之间有2倍关系, 某个分段的数字相当于2的编号次方, 如图:

二进制转十进制:

把每个数位单独转换后把所有的转换结果求和

例:01001110 = 2^6 + 2^3 + 2^2 + 2^1 = 64 + 8 + 4 + 2 = 78

十进制转二进制:

方法一:(不适用于处理大数字)先把十进制数字拆分成多个2的整数次方之和, 然后对每个结果单独转换, 最后其他数位补0。

59 = 32 + 16 + 8 + 2 + 1 = 2^5 + 2^4 + 2^3 + 2^1 + 2^0 = 00111011

方法二:除2取余, 逆序余数;

上述两种方法算出来的是二进制原码

计算机字节里采用二进制补码记录数字

所有非负数整数, 补码和原码一样

二、八进制

2.1 把二进制表示方式的所有数位从右向左每三个数位分成一组, 每组用一个0到7之间的数字代替可得到八进制表示方式

2.2 每三个数位可以采用421方法把二进制转化成八进制

2.3 可以在程序中使用八进制表示数字, 为了避免与十进制混淆, 需要在八进制前面加0(零)

2.4 %o可以作为八进制数的占位符

结果:

152 106

152 152

三、十六进制

3.1 所有数位从右向左每四个数位分成一组, 每组用一个字母替换就得到对应的十六进制表示方式, 先把每组转换成十进制, 转换结果如果在0到9之间则用阿拉伯数字字符替换, 否则用‘a’到'f'这六个英文字母替换

3.2 每四个数位可以采用8421方法把二进制转化成十六进制

3.2 可以在程序中使用十六进制表示数字, 但是必须以0x做开头

3.3 %x %X 可以作为十六进制数的占位符(%x输出a-f, %X输出A-F)

结果:

0xab 0XAB

练习: 十进制转二进制

四、负数的二进制

4.1 先计算出相反非负数的二进制

4.2 把第一步的计算结果每个数位变成相反内容, 然后再加一

求:-5的二进制:

5: 0000 0101

取反: 1111 1010 + 1

-5: 1111 1011

4.3 上述方法算出来的是二进制补码, 可以直接记录在字节中

4.4 有符号的二进制补码中最左边的数位叫做符号位, 符号位是0表示正, 1表示负, 且符号位不能等同与正负号

4.5 当把一个占地大的整数类型数据赋值给占地小的整数类型存储区时只会保留部分二进制数据, 因此导致十进制表示方式发生变化。

4.6 当把一个占地小的整数赋值给占地大的整数类型存储区时要扩充二进制数位, 在有符号位的情况下扩充出来的二进制里全是符号位的数值, 无符号数据填充0;

结果:

ch = 44

num = 44

分析:300是整数占四个字节, 用二进制表示如下(ps: 只保留最右边的)

00000000 00000000 00000001 00101100

练习:计算下面的结果(结果在下方)

结果:

ch = -56

num = -56

小伙伴们掌握了吗?一定要多多的练习哦~这样二进制的题目那是手到擒来!

问:下面结构体的定义语句中,错误的是( )。

A) struct ord {int x;int y;int z;} struct ord a;

B) struct ord {int x;int y;int z;}; struct ord a;

C) struct ord {int x;int y;int z;} a;

D) struct {int x;int y;int z;} a;

原文发布于微信公众号 - 老九学堂(xuetang9)

原文发表时间:2017-11-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java技术栈

涨姿势,图文带你了解 8 大排序算法

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

955
来自专栏C/C++基础

十种常见排序算法

十种常见排序算法一般分为以下几种: (1)非线性时间比较类排序:交换类排序(快速排序和冒泡排序)、插入类排序(简单插入排序和希尔排序)、选择类排序(简单选择...

741
来自专栏AI派

TensorFlow 修炼之道(1)——张量(Tensor)

TensorFlow名字可以拆解为两部分:Tensor、Flow。其中,Tensor 就表示张量。

3774
来自专栏Coding迪斯尼

在未知长度的超大数组中线性时间内查找第k大的元素

给定一个长度为n的数组,n是一个很大的值,而且事先不知道n的大小,给定一个确定的数值k,要求设计一个找出数组中第k大的元素,要求算法需要的空间不能超过O(k)。

872
来自专栏糊一笑

排序算法总结与实现

写在前面 一直很惧怕算法,总是感觉特别伤脑子,因此至今为止,几种基本的排序算法一直都不是很清楚,更别说时间复杂度、空间复杂度什么的了。 今天抽空理了一下,其实感...

3129
来自专栏用户画像

7.6.1 内部排序算法的比较

1、简单选择排序、直接插入排序和冒泡排序的平均情况下的时间复杂度都为O(n^2),并且实现过程比较简单,但直接插入排序和冒泡排序在最好的情况下时间复杂度可以达到...

602
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day09-重构随机点名器

Java基础-day09-重构随机点名器 1.案例介绍与演示 随机点名的案例由之前简单的Person对象,重构为相对完整的Person对象并使用。 2.案例回顾...

3686
来自专栏Dawnzhang的开发者手册

数据结构与算法学习笔记之如何分析一个排序算法?

现在IT这块找工作,不会几个算法都不好意思出门,排序算法恰巧是其中最简单的,我接触的第一个算法就是它,但是你知道怎么分析一个排序算法么?有很多时间复杂度相同的排...

793
来自专栏C语言及其他语言

【优秀题解】题解 1178: 三进制小数

你的任务呢,是将一个有理数转换成三进制小数。“什么是三进制小数呢?”你一定会问,这很明白,就是以三为基(二进制数以2为基,而十进制数则以10为基)的小数。

823
来自专栏ACM算法日常

基础算法|7 希尔排序 HDU 1425

我们从最初的冒泡排序算法,到上篇文章的折半插入排序算法,我们一共学习了5种排序算法,相信以大家的聪明才智肯定都消化了^_^。在本篇文章中,我们又将学习第6种排序...

572

扫码关注云+社区