首页
学习
活动
专区
圈层
工具
发布

保存象棋棋盘信息,需要多少比特?我只用139-167位二进制

死亡的棋子不再占用空间,使用类似map的结构,key是棋子id,value是棋子位置(0-89)。 压缩空间的方案:将帅个子有9个可能在的位置,只需要0-9即可表示,需要至多5位二进制。...分析方案二:在棋子多的时候,占用空间较多,所以存储空间的大小不太稳定。 方案三占用空间少,但是开发成本也较高,需要开发者去拼接二进制位。 今天我们探讨方案三。...至于6-7,我们需要在3位的6(110)和7(111)末尾新增0。 至于8-9我们需要在3位的6和7末尾新增1。...可以利用数学归纳法,归纳总结出这样的算法: 针对X个位置的情况,计算Log2(X),分别向下取整和向上取整,得到A和B。 如果A=B,则用A位二进制表示这X个数即可,直接转换进制。...如果A位二进制表示位置0至2^A-1-(X-2^A);用B位二进制表示其它位置;针对位置2^A-(X-2^A)至2^A-1,编码为A位的进制转换,并在末尾拼接一位0(共计B位);针对其它位置

4.3K111

整数的二进制表示中有多少个1的问题

我在剑指offer上面看到这道题,看到这道题是用c++写的,但是我用java编写的时候遇到问题。 首先描述问题:         一个整数(可以为整数也可以为负数),它的二进制表示中有多少个1,。...1.解法一:        就是右移这个数,然后与1进行按位与的运算,如果是1的话,那么技术器就加1,但是如果是负数的话,因为符号位是1,所以一直向右移动的话,高位就会一直补1,所以就会进入死循环,所以要进行绝对值的处理...,所以得出应该是30,所以按照剑指offer上的思路,用java是得不出正确结果的,所以还需要加符号处理,以下为我这种算法的代码: /** * 这种方法虽然不会引起死循环但是还是效率不高 * @...n&n-1就会连同最后一位1和之后的数据位都清零,所以说,减一次就能得出一个1,也就数有多少1,就操作几次,所以这种算法的效率最高,下面是我java的代码: /** * 这种算法是每次减去1就会使原来数字最左方的...,不知道大家遇到类似问题没,运用第三种解法还可以解决好多衍伸的问题,例如判断一个数是不是2的幂,因为如果是2的幂的话,那么就只有一个1,所以只需操作一次如果为0那么就是2的幂次方,再如,判断两个整数有多少位是不同的

47710
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    计算整数二进制表示中各个1位的数目

    编写一个函数,确定给定整数的二进制表示中各个1位的数目。 举例:给定一个数字是7,假设是8位操作系统,二进制表示为00000111,其中有3个1,则调用函数返回3。...整体思路:循环统计,检测二进制表示中的最后一位,如果最后一位是1的时候计数器加1,然后把数字右移一位,直到整个数字全部移完。...= number >>> 1; // 二进制右移1位 } return numOnes; } 上述算法已经很不错了,不过还有可以优化的部分。...一个数的二进制跟这个数减1的二进制相比,前半部分是相同的,只是翻转了最低位的1以及之后的各个位。...例如有个数的二进制位01110000(十进制112),该值减去1以后的二进制是01101111(十进制111),可以看到前三位是相同的,后面的位数是想反的。

    39610

    Leetcode 762: 二进制表示中质数个计算置位

    762 二进制表示中质数个计算置位 题目中所提到的二进制表示中单位计算置位为二进制表示中1的个数。 比如说(21){10}=(10101){2},则该数字的计算置位为3。...问题要求一段区间[left,right]中有质数个计算置位的数量。 换句话来说,该问题可以相当于快速计算出一个区间内每个数的计算置位,之后只需要判断这些置位是否为素数即可。...考虑以下情况 十进制 二进制 0 000 1 001 2 010 3 011 4 100 5 101 6 110 7 111 从这个表可以看到,二进制表示中从右往左数的第一位0和1的间隔为1个数字,第二位为...2个数字,第三位为4个数字……这也是二进制的本质。...换句话来说,可以分别计算出一段区间内第一位为1的数字,第二位为1的数字……然后对其进行求和。

    75720

    计算机程序的思维逻辑 (4) - 整数的二进制表示与位运算

    上节我们提到正整数相乘的结果居然出现了负数,要理解这个行为,我们需要看下整数在计算机内部的二进制表示。 十进制 要理解整数的二进制,我们先来看下熟悉的十进制。...十进制是如此的熟悉,我们可能已忽略了它的含义。比如123,我们不假思索就知道它的值是多少。...其实概念是类似的,二进制使用最高位表示符号位,用1表示负数,用0表示正数。 但哪个是最高位呢?...a = a | 0x1 //不管a原来最右边一位是什么,都将设为1 小结 本节我们讨论了整数的二进制表示,需要注意的就是负数的二进制表示,以及计算机进行二进制加减操作的过程,从而我们就能理解为什么有的时候正整数计算会出现负数...我们同样讨论了整数的位运算,需要注意的就是无符号右移和有符号右移的区别。 理解了整数,那小数呢?

    1.4K90

    LeetCode,求两个数字二进制位不同的有多少个

    力扣题目: 两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。...「汉明距离」是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d(x,y)表示两个字x,y之间的汉明距离。...golang的异或符 位运算就是将数值转换为二进制,按位进行操作。...异或计数 求x和y的二进制表示中不同位的个数,可以利用异或'^'的性质,相异为1,相同为0,也就是求x^y的二进制表示中,1的个数 func hammingDistance(x int, y int)...int { x = x^y count := 0 for x > 0 { //去掉x的二进制表示中,最低位的1,依次循环,直到将所有的1被删除,x为0则退出循环

    1.1K40

    IEEE 二进制浮点数的表示

    前段时间的一个项目中,需要编写一个可以与某个设备进行长连接并接收数据的 TCP Server,该设备会把一些数据发送过来,让 TCP Server 进行解析。...而 TCP Server 的开发并没有使用 C 语言或 C++ 进行,而是采用了 Java 语言的 Netty 框架进行开发,所以接收到的浮点数就需要进行转码。...今天,我来将 IEEE 二进制浮点数的表示方式进行一个简单的介绍。 浮点数 在 C 语言中,有两种存储浮点数的方式,分别是 float 和 double ,当然了还有long double。...IEEE浮点数表示 用 IEEE 编码表示浮点数,需要 3 部分进行表示,分别是 符号、指数 和 尾数。符号位占用 1 位,0 表示正数,1 表示负数。...IEEE 二进制浮点数的表示: 位数  符号位  指数位  尾数位 32   1 8 23     单精度(float) 64   1 11

    1.2K20

    浮点数的二进制表示

    那么,我们的问题就简化成:为什么0x00000009还原成浮点数,就成了0.000000? 3.根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式: ?...这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。 6.好了,关于浮点数的表示规则,就说到这里。...7.再看例题的第二部分。 请问浮点数9.0,如何用二进制表示?还原成十进制又是多少? 首先,浮点数9.0等于二进制的1001.0,即1.001×2^3。...所以,写成二进制形式,应该是s+E+M,即0 10000010 001 0000 0000 0000 0000 0000。这个32位的二进制数,还原成十进制,正是1091567616。...日期: 2010年6月 6日 http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html 浮点数的二进制表示

    1.1K10

    负数的二进制表示方法「建议收藏」

    比如 00000000 00000000 00000000 00000011 是 3的 原码。 反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。...举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢? 很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。...正数的补码是其本身 负数的补码是符号位不变 其他位取反之后加1 连着变换两次相当于没有做任何操作 16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:...注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。...又回了00000000,所以8位二进制系统的   模为2^8。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以   了。

    3.6K40

    【Java】基础02:字节,位元,比特

    为什么64G的手机,实际存储空间不到64G? 为什么100M的宽带就是达不到100M/秒? 今天我会在计算机世界里,找寻这些问题的答案。 现在一个月手机流量一般有多少? 1G?2G?...昨天详细了解了二进制,通过学习我们知道:在计算机中,都用二进制中的0和1来表示数据 。 所以无论是音乐、文档,还是电影也好,任何数据在计算机里体现的形式都是0和1。 ?...1024ZB 由此我们可以知道: 为何64G的手机存储空间往往只有50多G?...因为那些厂家他们都是用1GB=1000MB来计算的,所以实际空间比标明的空间要小。 那么为什么100M的宽带就是达不到100M/秒?最大速度能达到多少? 这就需要去了解字节与位元的关系了: ?...字节是二进制数据的单位,一个字节通常8位长 。 100M宽带,它的基础单位是bit,即兆比特(Mbit)每秒;而我们现实生活中用到的存储单元是Byte。

    1K40

    补码运算溢出判断方法是_一个8位二进制整数采用补码表示

    大家好,又见面了,我是你们的朋友全栈君。 溢出判断方法一   用Xf和Yf表示被加数和加数补码的符号位,Zf为补码和的符号位。当出现Xf = Yf= 0两数同为正,而Zf为负,即Zf=1时,有上溢。...溢出判断方法二   当数值最高位有进位位C1=1,符号位没有进位C0=0时,或当数值最高位没有进位位C1=0,符号位有进位C0=1时,结果有溢出。...溢出判断方法三: 用变形补码进行双符号位运算。在变形补码中,正数符号以"00"表示,负数的符号以"11"表示。一般称左边的符号位为第一符号位,右边的符号位为第二符号位。...若运算结果的符号位为"01",则表明有正溢出产生。若运算结果的符号"10",则表明有负溢出产生。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    1.4K30

    C语言位运算的妙用你知道多少?

    位运算在驱动开发中是经常遇到的,尤其是置0和置1。既要指定的位数发生变化,又不能改变其它位的值,还要高效率的编写代码,这时候技巧就很重要了。...在位运算中有几个符号: |  按位或 、& 按位与 、 ^ 异或 、~按位非。...应用技巧 1 判断int型变量a是奇数还是偶数  a&1   = 0 偶数 a&1   = 1 奇数 2 取int型变量a的第k位 (k=0,1,2……sizeof(int)) a>>k&1 3 将int...型变量a的第k位清0 a=a&~(1< 4 将int型变量a的第k位置1 a=a|(1< 5 int型变量循环左移k次 (设sizeof(int)=16) a=a16-k    6 int型变量a循环右移...) a % (2^n) 等价于 a & (2^n - 1) 12 乘法运算转化成位运算 (在不产生溢出的情况下) a * (2^n) 等价于 a<< n 13 除法运算转化成位运算 (在不产生溢出的情况下

    1.5K40
    领券