二进制

浮点数的二进制表示

三世轮回 提交于 2020-02-23 10:12:40
基础知识: 十进制转十六进制; 十六进制转二进制; IEEE 制定的 浮点数 表示规则; 了解: 眼下 C/C++ 编译器标准都遵照 IEEE 制定的浮点数表示法来进行 float,double 运算。这样的结构是一种科学计数法,用符号、指数和尾数来表示,底数定为 2—— 即把一个浮点数表示为尾数乘以 2 的指数次方再添上符号。以下是详细的规格: 符号位 阶码 尾数 长度 float 1 8 23 32 double 1 11 52 64 下面通过几个样例解说浮点数怎样转换为二进制数 例一: 已知: double 类型 38414.4 。 求:其相应的二进制表示。 分析: double 类型共计 64 位,折合 8 字节。由最高到最低位各自是第 63 、 62 、 61 、 …… 、 0 位: 最高位 63 位是符号位, 1 表示该数为负, 0 表示该数为正; 62-52 位,一共 11 位是指数位; 51-0 位,一共 52 位是尾数位。 步骤:依照 IEEE 浮点数表示法,以下先把 38414.4 转换为十六进制数。 把整数部和小数部分开处理 : 整数部直接化十六进制: 960E 。小数的处理 : 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够 53 位即可了。隐藏位技术:

浮点数的二进制表示学习笔记

瘦欲@ 提交于 2020-02-23 10:11:34
最近和一个同事做关于浮点数的接口,顺带研究了一下。 基础知识: 十进制转十六进制; 十六进制转二进制; IEEE制定的浮点数表示规则; 了解: 目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: 符号位 阶码 尾数 长度 float 1 8 23 32 double 1 11 52 64 以下通过几个例子讲解浮点数如何转换为二进制数 例一: 已知:double类型38414.4。 求:其对应的二进制表示。 分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位: 最高位63位是符号位,1表示该数为负,0表示该数为正; 62-52位,一共11位是指数位; 51-0位,一共52位是尾数位。 步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。 把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理: 0.4=0.5*0+0.25*1+0.125*1+0.0625*0+…… 实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。

2-8-10-16进制详解

梦想的初衷 提交于 2020-02-23 01:48:47
1、进制的由来 进制越大表达形式越简洁 2、进制的特征 二进制:由 0 ,1 组成。由 0b开头。 八进制:由 0 ,1…7 组成 。以 0 开头。 十进制:由0 ,1…9组成。整数默认十进制。 十六进制:由0,1…9,a,b,c,d,e,f(大小写均可)组成,由0x开头。 3、超级干货 举例:整数 12345 括号(n*n)括起来的表示 n的n次方 x :表示数学中的乘号。 12345 = 1x(10*4)+2x(10*3)+3x(10*2)+4x(10*1)+5x(10*0) 12345 = 10000+2000+300+40+5 12345 = 12345 仔细查看算式得出。 1.系数 ↓ (每一位上的数值就代表系数 例如 1,2,3,4各自都代表系数。) 2.基数 ↓ (要进行x进制换算 的基数就是x,8进制的系数就是 8) 3.权 ↓ :重点 (针对每一个位子上的数据进行编号 *从左边依次是 0,1,2,3,4* ) -:每一个位子上的 系数x(基数*权次幂)相加 就得出想要的进制数据。 4、实例 二进制 100 1.转换为八进制: 1x(8*2)+0x(8*1)+0x(8*0) =64+0+0 =64 2.转换十进制: 1x(2*2)+0x(2*1)+0x(2*0) =4+0+0 =4 3.转换为十六进制: 1x(16*2)+0x(16*1)+0x(16*0) =256

CSP-S T1格雷码

别来无恙 提交于 2020-02-22 21:27:23
题目大意: 格雷码(Gray Code)是一种特殊的 n n 位二进制串排列法,它要求相邻的两个二进制串间 恰好 有一位 不同 ,特别地,第一个串与最后一个串也算作相邻。 n n 位格雷码不止一种,下面给出其中一种格雷码的生成算法: 1 1 位格雷码由两个 1 1 位二进制串组成,顺序为: 0 0 , 1 1 。 n + 1 n+1 位格雷码的前 2 n 2n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2 n 2n 个 n n 位二进制串)按 顺序 排列,再在每个串前加一个前缀 0 0 构成。 n + 1 n+1 位格雷码的后 2 n 2n 个二进制串,可以由依此算法生成的 n n 位格雷码(总共 2 n 2n 个 n n 位二进制串)按 逆序 排列,再在每个串前加一个前缀 1 1 构成。 综上, n + 1 n+1 位格雷码,由 n n 位格雷码的 2 n 2n 个二进制串按顺序排列再加前缀 0 0 ,和按逆序排列再加前缀 1 1 构成,共 2 n + 1 2n+1 个二进制串。另外,对于 n n 位格雷码中的 2 n 2n 个 二进制串,我们按上述算法得到的排列顺序将它们从 0 ∼ 2 n − 1 0∼2n−1 编号。 现在给出 n n , k k ,请你求出按上述算法生成的 n n 位格雷码中的 k k 号二进制串。 1 ≤ n ≤ 64 , 0 < k <

二进制枚举

北战南征 提交于 2020-02-22 21:19:27
二进制枚举 对于一个集合子集有 \(2^n\) 个,所以枚举有 \((1 << n)\) 个 for(int i = 0; i < (1 << n); i++) 在二进制里0表示不选,1表示选 当n = 3时,集合有 \({0,1,2,01,02,12,012}\) 七种选择 \(i = 0\) 时,不选 \(i = 1\) 时, \(001\) 只选择最后一行就是0 \(i = 2\) 时, \(010\) 只选择倒数第二个,就是1 \(i = 3\) 时, \(011\) 选择倒数两个,就是0和1 \(...\) \(i = 7\) 时,111选择全部,就是0,1,2 这样正好对应 \(n = 3\) 时的8个状态 那么问题就是如何使得选择对于数字的二进制呢 相当于对于i = 一个值时,枚举n位,看看哪位是1,是的话就输出 for(int i = 0; i < (1 << n); i++){ for(int j = 0; j < n; j++){ if(i & (1 << j)) } } 如果 \(i = 6\) 对应二进制是 \(110\) ,而此时枚举j为0,1,2,把它进行 \((1 << j)\) 后为 \(001,010,100\) 如何与i和取,如果是1,那么就是选择的条件 时间复杂度 \(O(2^n * n)\) 所以 \(n<20\) 时可以进行枚举 来源:

二进制中1的个数

陌路散爱 提交于 2020-02-22 18:06:33
题目描述   输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解题思路   对于n来说,n&(n-1)能够将n的二进制表示中最右面的1变为0,比如n的二进制表示为xxx100,n-1的二进制表示为xxx011,显然进行一个&操作之后,最右面的1已经变为0,那么有多少次操作n可以变为0,n中就含有多少个1。 实现代码 class Solution { public : int NumberOf1 ( int n ) { int cnt = 0 ; while ( n ) { cnt ++ ; n & = n - 1 ; } return cnt ; } } ; 来源: CSDN 作者: qq_41922018 链接: https://blog.csdn.net/qq_41922018/article/details/104444959

二进制状态压缩DP

怎甘沉沦 提交于 2020-02-22 02:53:06
描述 给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数n。 接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i,j])。 对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。 输出格式 输出一个整数,表示最短Hamilton路径的长度。 数据范围 1≤n≤20 0≤a[i,j]≤107 输入样例: 5 0 2 4 5 1 2 0 6 5 3 4 6 0 8 3 5 5 8 0 5 1 3 3 5 0 输出样例: 18 一看到这道题目的时后我们一眼就觉得这是一道搜索题,但是我们仔细分析一下时间复杂度: 头尾都是确定的,因此我们要对中间的(n - 2)个数进行全排列,大概就是(n - 2)!次方次排列,于是我们自然而然的就想到了用DP来绝决这个问题,但是用DP我们又该怎么样来表示这之间的状态呢。 每一个位置我们用0,1,来表示。0代表没走过,1代表已近走过, 由此我们就有了状态转移方程。 DP[A][j] = min(DP[A][j], DP[B][k] + value[k][j]) 其中 A 、 B ,分别时两个集合。

Linux 基础——权限管理命令chmod

流过昼夜 提交于 2020-02-22 00:03:39
一、Linux中的文件权限与目录权限    Linux中定义了3种访问权限,分别是r、w、x。其中r表示对象是可读的,w表示对象是可写的,x表示对象是可执行的,这3种权限组成一组rwx分别对应对象的3个安全级别。这3个安全级别分别是对象的所属者,对象的所属组,系统其他用户。比如图1-1所示,文件的权限                                                   图 1-1 二、理解权限(rwx)的位权值   rwx3种权限中,每一个权限代表一个二进制位。其中r权限二进制表示为100,八进制表示为4;w权限二进制表示为010,八进制表示为2;r权限二进制表示为001,八进制表示为1;无任何权限表示为---,即二进制表示为000,八进制表示为0。所以拥有rwx权限即可表示为4+2+1即7,rw-权限表示为4+2+0即6,r-x权限表示4+0+1即5,r--权限即4,以此类推即可获得权限的位权值表示。 三、chmod命令的用法   (1)chmod mode dest_file:改变指定文件或目录的权限,其中mode参数可以使用八进制模式或符号模式进行权限设置。   (2)chmod -R mode dest_file:-R选项可以让权限改变递归地作用到文件和子目录。   下面来说说使用常用符号模式进行权限设置,如下是在符号模式下指定权限的格式:

JAVA基础-float存储方式

瘦欲@ 提交于 2020-02-21 06:39:58
我们都知道整数在内存中是通过变为二进制数进行存储,但在 float 浮点类型的小数却有着独特的存储方式 参考: https://blog.csdn.net/weiguishan/article/details/43889101 可以得到如下存储方式模型: 指数位代表8位无符号二进制数,表示0~255的范围,但是指数应可正可负,所以IEEE规定,此处算出的次方须减去127才是真正的指数。所以float的指数可从 -126到128 按照以上的模型,浮点数据就以 符号位 指数位 底数位 S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM 方式存储在四个字节中,其中: S: 符号位,1为负,0为正 E: 指数加上127后的值的二进制数 M: 24-bit的底数(只存储23-bit) 下面举个例子来模拟一次存储过程: 对于一个小数6.25 1).将其转为二进制:111.01(转换过程不再赘述) 2).小数点向左移动直到小数点前只剩一个1,由于移动了3位,指数E就为3+127=130,用二进制表示:10000010 3).在经过移动后,原本的二进制变为:1.1101,此时底数M为1101 4).由于该小数位正数,故S为1 综上所述,6.25浮点类型二进制表示为:1 10000010 11010000000000000000000 和上方的表格一致

[LeetCode] 868. 二进制间距

心已入冬 提交于 2020-02-21 02:40:43
1 题目描述 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。 如果没有两个连续的 1,返回 0 。 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 。 在 22 的二进制表示中,有三个 1,组成两对连续的 1 。 第一对连续的 1 中,两个 1 之间的距离为 2 。 第二对连续的 1 中,两个 1 之间的距离为 1 。 答案取两个距离之中最大的,也就是 2 。 示例 2: 输入:5 输出:2 解释: 5 的二进制是 0b101 。 示例 3: 输入:6 输出:1 解释: 6 的二进制是 0b110 。 示例 4: 输入:8 输出:0 解释: 8 的二进制是 0b1000 。 在 8 的二进制表示中没有连续的 1,所以返回 0 。 提示: 1 <= N <= 10^9 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-gap 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 2 解题思路 解决方法:存储索引 思路 由于我们想要检查数字 N 的二进制表示法中连续的 1 之间的距离,让我们先记录下该二进制表示中每个 1 的索引。例如,如果 N = 22 = 0b10110,那么我们将记录 A = [1, 2, 4]