二进制

二进制补码

余生颓废 提交于 2020-02-28 22:45:25
计算机系统中,数值一律用二进制的补码来存储 二进制的最高位是符号位,0表示正数,1表示负数 正数的值是其本身,负数的值是最高位即符号位不变,其他位取反,再加1 两数相加,若符号位有进位,则进位被舍弃。 来源: CSDN 作者: weixin_29210367 链接: https://blog.csdn.net/weixin_29210367/article/details/104564580

不同进制数的转换

喜你入骨 提交于 2020-02-28 19:16:47
______________________________________ 二进制转换为十进制 二进制转换为十进制 方法:“按权展开求和” 先将二迸制的数写成加权系数展开式,而后根据十进制的加法规则进行求和 规律:个位上的数字的次数是0,十位上的数字的次数是1,…,依次递增,而十分位的数字的次数是-1,百分位上数字的次数是-2,…,依次递减。 十进制数转换为二进制 分整数部分和小数部分分别转换 整数部分采用除2取余,逆序排列"法。 用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为小于1时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来 小数部分要使用“乘 2 取整”法。 用十进制的小数乘以 2 并取走结果的整数(必是 0 或 1),然后再用剩下的小数重复刚才的步骤,直到剩余的小数为 0 时停止,最后将每次得到的整数部分按先后顺序从左到右排列即得到所对应二进制小数。 十六进制转换为二进制 由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换,即得所求. 二进制转换为十六进制 16进制用2进制可以表现成0000~1111,也就是每四位二进制数为一位十六进制数。

给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数

筅森魡賤 提交于 2020-02-28 14:20:58
/** * 功能:给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数。 * (一个略大一个略小。) */ 三种方法: 方法一:蛮力法 方法二:位操作法 [java] view plain copy <span style="white-space:pre"> </span>/** * 方法:位操作法 * 思路:获取后一个较大的数 * 1)计算c0和c1。c1是拖尾1的个数,c0是紧邻拖尾1的作坊一连串0的个数。 * 2)将最右边、非拖尾0变为1,其位置为p=c1+c0。 * 3)将位p右边的所有位清零。 * 4)在紧邻位置p的右方,插入c1-1个1。 * @param n * @return */ public static int getNext(int n){ int c=n; int c0=0; int c1=0; while((c&1)==0&&(c!=0)){ c0++; c>>=1; } while((c&1)==1){ c1++; c>>=1; } if(c0+c1==31||c0+c1==0)//c0+c1+1=32,1表示p所在位。 return -1; int p=c0+c1;//最右边处,非拖尾0的位置。 n|=(1<<p);//翻转0为1 n&=~((1<<p)-1);//将p右边的所有位清零 n|=(1<<(c1-1))-1;/

二进制数据和乱码

百般思念 提交于 2020-02-28 12:44:26
二进制数据和乱码 二进制是计算技术中广泛采用的种数制,是用0和1两个数码来表示的数据,例出小写字母a在Windows系统中的二进制数据就是01100001。每个二进制位就是0和1的两种状态,它的基数为2,进位规则是“逢二进一“ 借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本都是二进制系统。 由于计算机只能识别二进制数据,而人们很难看懂“1010”代表什么,因此,需要将二进制数据转换为人们能够方便识别的字符,这时就需要设置字符编码。通过字符编码找到相应的字符集进行“翻译” ,这个字符集可以看作一本字典。 Windows 系统最原始的字符编码就是ASCII,该编码对应ASCII字符集,它支持英文中常用的字母、数字和标点符号等与二进制数据之间的转换,同时还提供八进制、十进制和十六进制的对应编码,各种编码都可以相互转换。 下面使用Windows系统的计算器演示二进制数据和十进制数据间的转换。 首先找到Window系统中的计算器,计算器的标准形式如下图所示。 在计算器中选择“查看”——>“程序员”命令,会跳转到程序员使用的计算器,如下图所示。 在上图中,可以看到二进制、八进制、十进制、十六进制等选项,当前选中为二进制,只能使用按钮0或者按钮1,单击按钮,输人1100001选择十进制选项,如下图所示。 从上图中可以看出

剑指offer-20200228

耗尽温柔 提交于 2020-02-28 12:43:23
20200228 题目 :二进制中1的个数 实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。 思路 :与二进制有关的题目,通常应用 位运算 解决。 根据 与运算 定义,设二进制数字 n,则有: 若 n& 1 = 0n&1=0 ,则 n二进制 最右一位 为 0 ; 若 n & 1 = 1n&1=1 ,则 n 二进制 最右一位 为 1 。 循环判断: 判断n最右一位是否为1,根据结果计数。 将n右移位。 code public class Solution { public int hammingWeight ( int n ) { int res = 0 ; while ( n != 0 ) { res += n & 1 ; n >>>= 1 ; //向右移动一位。 } return res ; } } 复杂度分析 时间复杂度$ O(log_2n) : 此 算 法 循 环 内 部 仅 有 移 位 、 与 、 加 等 基 本 运 算 , 占 用 :此算法循环内部仅有移位、与、加等基本运算,占用 : 此 算 法 循 环 内 部 仅 有 移 位 、 与 、 加 等 基 本 运 算 , 占 用 O(1) ; 逐 位 判 断 需 要 循 环 ;逐位判断需要循环 ; 逐 位 判 断 需 要

Java 位运算(转)

北城以北 提交于 2020-02-28 11:44:37
位移动运算符: <<表示左移, 左移一位表示原来的值乘2. 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位, 3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100, 转换为十进制是12。 同理,>>表示右移. 右移一位表示除2. 位运算: 位运算符包括: 与(&)、非(~)、或(|)、异或(^)   &:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000    | :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110    ~:0变1,1变0    ^:两边的位不同时,结果为1,否则为0.如1100^1010=0110 位运算与位移动运行符的一个场景: HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程: 1、 当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode(); 2、 再把hash通过一下运算得到一个int h. hash ^= (hash >>> 20) ^

java位运算符

别说谁变了你拦得住时间么 提交于 2020-02-28 07:14:56
一、什么是位运算 位运算是对操作数以二进制为单位进行的操作和运算,运算结果为整数。计算机内部是用补码表示数,位运算是对数的补码进行运算,正数的补码等于原码,负数的补码等于其相反数的原码取反加1。 二、位运算符 1.&(按位与) 参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为1,那么计算结果才为1,否则为0。因此,任何数与0按位与运算,其结果都为0。 2.|(按位或) 参与运算的数字,低位对齐,高位不足的补零。只要对应的二进制位有一个为1,那么结果就为1,否则为0。 3.^(按位异或) 参与运算的数字,低位对齐,高位不足补零,如果对应的二进制位相同,结果为0,否则结果为1。 4.~(按位取反) 只对一个操作数进行运算,将操作数二进制中的1改为0,0改为1. 因为在计算机中使用补码表示,最高位为1表示负数。补码求原码的方法是最高位符号不变,其余各位求反,再加1。 5.<<(左移位) 按二进制形式把所有的数字向左移动对应的位数,符号不变,高位移除(舍弃),低位补零。 6,>>(右移位) 按二进制形式把所有的数向右移动对应的位数,低位移出(舍弃),正数的高位的空位补0,负数的高位的空位补1. 7.>>>(无符号右移) 按二进制形式把所有的数字向右移动相对应的位数,低位移出(舍弃),高位的空位补零(无论正数负数都补零)。 来源: CSDN 作者: 久伴丶.丶 链接:

二进制中的原码反码补码

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-28 04:53:17
二进制中的原码、反码、补码 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1] 原 = 0000 0001 [-1] 原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反. [+1] = [00000001] 原 = [00000001] 反 [-1] = [10000001] 原 = [11111110] 反 可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算. 3. 补码 补码的表示方法是: 正数的补码就是其本身 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1) [+1] = [00000001] 原 = [00000001] 反 = [00000001] 补 [-1] = [10000001] 原 = [11111110] 反 = [11111111] 补 对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.

高性能Java序列化框架Fse发布

删除回忆录丶 提交于 2020-02-28 04:22:39
高性能Java序列化框架Fse发布 使用场景 将Java对象序列化为二进制数据进行保存,以及二进制数据反向序列化为Java对象,在很多场景中都有应用。比如将对象序列化后离线存储至其他介质,或者存储于Redis这样的缓存之中。 目前常见的有几种框架可以支撑,比如 Hession ,Kryo,Protobuf,JDK原生等。有一些框架需要提前编写元数据配置文件以支撑跨语言序列化能力,比如 Protobuf 。不过如果团队的技术栈是统一的 Java 体系的话,则能够开箱即用的序列化框架使用起来会更加方便一些,特别有些时候对象特别复杂,编写元数据配置文件也是很繁琐的一个事情。 Fse 框架正是应用于这样的场景,不需要编写元数据配置信息,开箱即用的 Java 序列化框架,对需要序列化的对象没有任何特殊要求。在性能基准测试中,该框架的性能表现显著优于其他框架,下面是测试对比 欢迎加入技术交流群186233599讨论交流,也欢迎关注笔者公众号:风火说。 使用说明 首先在Pom文件中引入依赖,如下 <dependency> <groupId>com.jfireframework</groupId> <artifactId>fse</artifactId> <version>aegean-1.0</version> </dependency> API 使用方式如下 Fse fse = new Fse

理解有符号数和无符号数

陌路散爱 提交于 2020-02-28 04:10:10
http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html 声明网上看到的文章,原文找不到了,原文被转载的不成样子,重复很多,整理花了很长时间,在翻看了维基百科后发现,原文中对于负数原码和补码存在一些问题,修改了一部分,原作者看到后可以联系我。 1、你自已决定是否需要有正负。 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。 在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned)数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。 比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。 2、使用二制数中的最高位表示正负。 首先得知道最高位是哪一位?1个字节的类型,如字符类型,最高位是第7位,2个字节的数,最高位是第15位,4个字节的数,最高位是第31位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意)。字符类型固定是1个字节,所以最高位总是第7位。 (红色为最高位) 单字节数: 11111111 双字节数: