二进制算法

负数为什么要用补码来表示?

▼魔方 西西 提交于 2020-02-16 00:13:32
负数为什么要用补码来表示? 今天,发生一件非常有趣的事情。 公司同事问了我一个问题:为什么 2.0 - 1.1 = 0.89999999 呢?不应该是 0.9吗? 原来是,他问了周围一圈的同事,都给他的是同一个回答,说这是精度问题。他百思不得其解,怎么就会产生精度问题呢。再问,就没人知道原因了。 然后,我就看到了他抱着一本厚厚的书在看。拿过来一看,是一本Java书,厚厚的六百多页,这还仅是第一卷。哟呵,这是准备大干一场啊。 看在他这么努力学习的份上,还有他那对知识极度渴望的眼神。我决定,把我毕生所学传授与他。 于是,就给他详细讲解了,计算机中是怎么存储一个数的,十进制是怎么在转二进制的过程中丢失精度的,以及浮点数是怎么遵循IEEE 754 规范的,在浮点数进行加减运算的过程中会经历对阶、移位运算等过程,以及在此过程中是怎么丢失精度的。(这些问题在之前的文章中都有解答,参看“为什么0.1+0.2=0.30000000000000004”) 然后,成功的把他彻底搞懵逼了。怎么这么难啊。 原来,他的计算机基础比我还匮乏,不知道什么是位运算,不知道什么是原码、反码和补码。 本着我的热心肠,我就给他普及了一下这些知识 ---- 负数的补码形式和位移运算。 我们知道,一个数分为有符号和无符号。对于,有符号的数来说,最高位代表符号位,即最高位1代表负数,0代表正数。 在计算机中,存储一个数的时候

[算法题] 字节流解析

让人想犯罪 __ 提交于 2019-12-26 16:47:21
版权声明:本文为CSDN博主「北京-大白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/robothj/article/details/79776407 RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1) 原创 雷霄骅 字节流解析 题目标题: 根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引升序。 详细描述: 接口说明 原型: voidDecode(unsignedintuiIutputLen,unsignedcharaInputByte[],unsignedintuiElementNum,ELEMENT_STRU astElement[]); 输入参数: unsignedintuiIutputLen:字节数组(流)长度 unsignedcharaInputByte:字节数组(流) unsignedintuiElementNum:解析数值个数 ELEMENT_STRU astElement[]:数值的结构数组指针,含义如下 Struct { unsignedintuiElementLength; //表示uiElementValue占用BIT数,范围1~32

Unicode、UTF8、UTF16

末鹿安然 提交于 2019-12-26 07:05:13
推荐一篇 文章 ,此博客是阅读这篇文章后自己的一些总结与理解 Unicode Unicode是一种标准,他收集了世界上所有的字符,并为每个字符分配了一个唯一的码点 现在来看看Unicode字符集是长什么样子,由于全球所有的字符太多太多,按照字符的类型使用频率把字符分了17个平面,如图,每个平面的码点唯一对应一个字符(当然也有还没用到的,因为实际上字符并没有那么多),像平面0上的码点就放着最常用的字符 拿平面0举例,我们常用的字符 A 就在平面0上,A对应的字符编码是0041,即图中平面0的0000-0FFF中的0041, 这个0041就是码点 这个0000-10FFFF就是码点空间 0000-10FFFF与全球字符的对应关系就是编码字符集 专业术语概念 Coded Character Set(CCS):编码字符集,将全球的字符收集起来每个分配唯一的字符编号,Unicode字符集就是一种编码字符集 Character Encoding Form(CEF):将ccs中的字符编号按照某种规则转化成二进制序列,UTF8、UTF16就是一种字符编码表 Code Point:码点,即ccs中的字符编号 Code Unit:代码单元,已编码的文本中具有最短bit位的单元,UTF8是8bit长,UTF16是16bit长(至于UTF8为什么是8bit,UTF16为什么是16bit,后面还会介绍)

哼 又是被秀智商的一波 我服

匿名 (未验证) 提交于 2019-12-03 00:34:01
CodeForces 难度:2级算法题 一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。 当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。 Input Output 输出答案占一行。 Input示例 9 Output示例 9 所以就是求一个每一位对10取余的最大值。 #include <iostream> #include <cstdio> using namespace std ; int main() { int n; scanf ( "%d" ,&n); int ans = 0 ; while (n) { int m = n% 10 ; if (ans < m) ans = m; n /= 10 ; } cout <<ans<<endl; return 0 ; } 文章来源: 哼 又是被秀智商的一波 我服

进制转换

匿名 (未验证) 提交于 2019-12-02 22:51:30
第一个:十进制----->二进制 题目:将 759换成二进制 10 9 8 7 6 5 4 3 2 1 0 1024 512 256 128 64 32 16 8 4 2 1 1 0 1 1 1 1 0 1 1 1 算法: 1. 759 - 512 = 247 (在第9位下画1) 2. 247 - 128 = 119(在第7位下画1) 3. 119 - 64 = 55 (在第6位下画1) 4. 55 - 32 = 23(在第5位下画1) 5. 23 - 16 = 7 (在第4位下画1) 6. 7 - 4 = 3 (在第2位下画1) 7. 3 - 2 = 1 (在第1位下画1) 8. 1 - 1 = 0 (在第0位下画1) 结果:将以上没有画1的位置补上0,再组合输出:101 111 0111 第二个:二进制-----> 十进制 题目:将101 111 0111换成十进制 算法:将以上第三行有画1的上方数字连加结果: 512 + 128 + 64 + 32 + 16 + 4 + 2 + 1 = 759 第三个:二进制----->八进制 题目:将101 111 0111换成八进制 算法:口诀:三位一组 拆分拼接 1 011 110 111 1 3 6 7 (将以上3位的二进制转换成十进制) 结果:0o1367 第四个:八进制----->二进制 题目:将0o1367换成二进制 算法: 1

算法:快速幂

浪子不回头ぞ 提交于 2019-12-01 00:45:49
快速幂取模 用法:用于求解 a 的 b 次方,而b是一个非常大的数,用O(n)的复杂度会超时。 假如求 x ^ n 次方,我们可以把 n 表示为 2^k1 + 2k2 + 2^k3….,可以证明所有数都可以用前式来表示。(其实就是二进制表示数的原理) 即 x^n = x 2 k1 * x 2 k2 * x 2 k3…… 那么就可以利用二进制来加快计算速度了。 假如 x^23 , 23转化为二进制为 10111, 即 x^23 = (x^16) * ( x^4) * ( x^2) * (x^1);通过判断二进制x是否为1来判断是否加入运算中,(x>>1)每次向右移动一位,(x&1)判断是否为1,如果是1,则加入运算。如果不是,则x的幂次方继续乘方(1,2,4,8,16,32增长,作为待用乘法因子)。 # include <stdio.h> /* function: 求 x 的 y 次幂 param: x-->底数 y-->指数 return: x^y 的结果 */ int quickPower ( int x , int y ) { int result = 1 ; // 定义变量 while ( y > 0 ) // 当指数大于 0 时进行幂运算 { if ( y & 1 ) // y 和 1 做与运算,相当于对 2 求模 { result = result * x ; // 如果