精华内容
下载资源
问答
  • 二进制最长多少位
    2021-06-08 18:23:22

    题目描述:

    https://www.nowcoder.com/questionTerminal/4b1658fd8ffb4217bc3b7e85a38cfaf2
    题目链接如上,看完本篇题解可以点开巩固一下~~~
     

    求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
    本题含有多组样例输入。

     

    输入描述:

    输入一个byte数字

    输出描述:

    输出转成二进制之后连续1
    示例1

    输入

    3
    5

    输出

    2
    1

    说明

    3的二进制表示是11,最多有2个连续的1。
    5的二进制表示是101,最多只有1个连续的1。 
    

    解题思路:

           定义两个计数器count和allCount,其中count用于记录当前连续的1的个数,allCount用于记录当前最大连续1的个数。每次用此元素和1进行与运算,若此时为1,count计数器加1,并使allCount记录当前的最大连续1的个数。若此时不为1,则需要将count计数器的值重置为0,继续记录接下来连续的1的个数。

           需要注意的是,每一次运算完之后需要将此元素右移一位,直至此元素为0,表明当前没有元素的二进制中没有“1”。

     

           Java解决问题代码如下:

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNextInt()) {
                int count = 0;//记录当前存储的连续1的个数
                int allCount = 0;//记录当前数字最大的连续1的个数
                int check = in.nextInt();
                while (check != 0) {//当检查数字不为0时表示当前数字的二进制位中还存在1
                    if((check & 1) == 1) {//最低一位数字与1进行与运算
                        count++;
                        allCount = Math.max(count, allCount);
                    } else {
                        count = 0;//若此时最低位不为1,则需要将计数器置为0
                    }
                    check >>= 1;//每次运算后需要将此元素右移一位,继续检查最低位的数字
                }
                System.out.println(allCount);
            }
        }
    }

     

    更多相关内容
  • C++计算一个数字的二进制中0或1的个数原理及代码
  • 此代码检测任何给定字符串中最长的 1 字符串
  • 例如,给定N = 1041,该函数应返回5,因为N具有二进制表示形式10000010001,因此其最长二进制间隙为长度5。 假使,假设: N是在[1..2,147,483,647]范围内的整数。 复杂: 预期的最坏情况下的时间复杂度为O(log...
  • 布尔值只有true(真)和false(伪)两个固定值的数据类型,本能的让我想起计算机二进制里面的1和0,哈哈。通常这个数据类型是用来对程序流程进行控制的,如果你还记得判断语句,就会发现一个判断语句可以执行下去的...

    1d32a0f0a36781333198e25baefe9e48.png

    前面那个部分介绍的比较简单,这样容易理解一点,接下来就可以来看看稍稍复杂一些的类型了:

    1. 布尔值

    只有true(真)和false(伪)两个固定值的数据类型,本能的让我想起计算机二进制里面的10,哈哈。

    通常这个数据类型是用来对程序流程进行控制的,如果你还记得判断语句,就会发现一个判断语句可以执行下去的依据就是布尔值,如下:

    // 无限循环
    

    所以在JavaScript预期是布尔值的地方(如if后面的括号里面),就会根据各种条件运算出对应的布尔值,包括:

    • 前置逻辑运算符: (Not)
    • 相等运算符:=====!=!==
    • 比较运算符:>>=<<=

    通过上面的这些运算符,就可以得到布尔值了;不过也有可能看到一种很特殊的情况,就是括号里面是一个非布尔值的变量,这种情况下,由于JavaScript预期会得到布尔值,就会进行强制的自动类型转换,把下面这6个值识别为false

    • undefined
    • null
    • false
    • 0
    • NaN
    • ""''(空字符串)

    而除此以外的其他值自动识别为true。

    如图,空字符串为false

    7aa93e9a6e411c56efb0a729fb3b161c.png

    在这个地方经常会有个误解,因为空字符串会被认为是伪,有些人会感觉空数组或者空对象应该也是伪,可事实上呢?

    73ad74f5e1163dab9abef01803a8a073.png

    其实空数组或者空对象在自动转换的时候,会被识别为真(true)的,注意别踩这个坑!


    2. 数值

    2.1 整数和浮点数

    和其他的语言有很大的区别,JavaScript是没有区分整数和浮点数的,在它内部,所有的数值都是使用64位的浮点数储存的,故而请注意11.0是全等的:

    7af8468d03336b2cdb406ea5b0870ef5.png

    类似的运算在Python当中虽然也可以得到相同的结果,因为Python会自动将整数值转换为浮点数进行对比计算,但是两者并不全等,所以使用1 is 1.00 进行判断得到的结果是False(Python当中的布尔值首字母是大写的):

    184df43ca7e6baf25f328b84ae2bb9f1.png

    也就是说,JavaScript底层根本没有整数这个类型,所有的数字类型其实都是浮点数值。由于浮点数设计之初就不是个精确的数值,故而一定要留意带有小数点的浮点数相互计算的结果,譬如下面的这个经典问题:

    b7a6f8a2d05a39313e1a0be7bf444bc8.png

    别怀疑自己的眼睛,事实如此,我也很无奈……

    2.2 数值精度

    根据国际标准 IEEE 754,JavaScript 浮点数的64个二进制位,从最左边开始,是这样组成的。

    • 第1位:符号位,0表示正数,1表示负数
    • 第2位到第12位(共11位):指数部分
    • 第13位到第64位(共52位):小数部分(即有效数字)

    符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。

    指数部分一共有11个二进制位,因此大小范围就是0到2047。IEEE 754 规定,如果指数部分的值在0到2047之间(不含两个端点),那么有效数字的第一位默认总是1,不保存在64位浮点数之中。也就是说,有效数字这时总是1.xx...xxx的形式,其中xx...xxx的部分保存在64位浮点数之中,最长可能为52位。因此,JavaScript 提供的有效数字最长为53个二进制位

    (

    上面公式是正常情况下(指数部分在0到2047之间),一个数在 JavaScript 内部实际的表示形式。

    精度最多只能到53个二进制位,这意味着,绝对值小于2的53次方的整数,即

    ,都可以精确表示。

    20688c742408639072b3fe92ce324c70.png

    如上图第一到第三行,在

    范围以内,数值是可以正确表示出来的;可一旦超出,就不再准确了。由于2的53次方是一个16位的十进制数值,所以简单的法则就是,JavaScript 对15位的十进制数都可以精确处理。

    c8f9fa29ce1f8459548fb5506fb15407.png

    如上图,超出的几位数字,是完全无法保存的……

    2.3 数值范围

    根据标准,64位浮点数的指数部分的长度是11个二进制位,意味着指数部分的最大值是2047(2的11次方减1)。也就是说,64位浮点数的指数部分的值最大为2047,分出一半表示负数,则 JavaScript 能够表示的数值范围为

    (开区间),超出这个范围的数无法表示。

    如果一个数大于等于2的1024次方,那么就会发生“正向溢出”,即 JavaScript 无法表示这么大的数,这时就会返回Infinity;而如果一个数小于等于2的-1075次方(指数部分最小值-1023,再加上小数部分的52位),那么就会发生为“负向溢出”,即 JavaScript 无法表示这么小的数,这时会直接返回0

    a7e84a7ad3dd4137635b2f00a9cb2178.png

    来看个实际的例子,我们声明名字为x变量,赋值为0.8,通过循环让它连续自乘25次:

    2802e0291b075cf35833d69658bc640f.png

    由于最后结果太接近0,超出了可表示的范围,JavaScript 就直接将其转为0

    JavaScript 提供Number对象的MAX_VALUEMIN_VALUE属性,返回可以表示的具体的最大值和最小值。

    dc25915ec72f4d027f1789692e7cbd2b.png

    2.4 数值的进制和表示方式

    JavaScript 对整数提供四种进制的表示方法:十进制、十六进制、八进制、二进制。

    • 十进制:没有前导0的数值。
    • 八进制:有前缀0o0O的数值。
    • 十六进制:有前缀0x0X的数值。
    • 二进制:有前缀0b0B的数值。

    默认情况下,JavaScript 内部会自动将八进制、十六进制、二进制转为十进制,比如:

    68865b783be3dc47b9283a99abc7c303.png

    如果在这些进制的数值当中出现不正确的其他数值,就会报错。

    • 八进制数值不能包含数字8和9;
    • 十六进制数值不能包含排序在F(代表15)之后所有字母;
    • 二进制数值不能包含大于1的数字;

    如下图:

    f65bbc0128f2b1b30755c43e38a55cd2.png

    以上这些都是用字面形式直接表示,JavaScript也可以支持使用科学计数法表示:

    c8a0f7918891b4f7185ec11079517365.png

    科学计数法允许字母eE的后面,跟着一个整数,表示这个数值的指数部分。

    以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。

    1. 小数点前的数字多于21位;
    2. 小数点后的零多于5个;

    如图:

    1b64ae830be03367970fab8b2e03c4e1.png

    2.5 几个特殊数值

    • 0

    JavaScript 的64位浮点数之中,有一个二进制位是符号位。这意味着,任何一个数都有一个对应的负值,就连0也不例外。

    JavaScript 内部实际上存在2个0:一个是+0,一个是-0,区别就是64位浮点数表示法的符号位不同,本质上来说它们是等价的。

    7956716195231dafaff166e358f6f623.png

    仅有一种特殊的情况,两者会不同:

    72f0f3b1bf29117e1521a6dc18d06bed.png

    这是因为前者得到的结果是正无穷大(+Infinity),而后者是负无穷大(-Infinity),故而两者不全等。

    • Infinity

    无穷大,即Infinity,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,所得到的结果(是的,开发编程的世界里,0有的时候也可能是分母)。

    4975871df96ec4400986dfb678cf2657.png

    上图中0除以0得到的是NaN(即非数值,Not a Number)。

    Infinity有正负之分,即正无穷大和负无穷大,分别代表大于一切数值和小于一切数值(不包括NaN),且两者并不相等:

    0da39a06926283a1028d219ff87c9ffb.png

    Infinity的计算规则就是典型的数学意义上的运算规则:

      • 任何非0NaN且非无穷数值与之相加、相减、相乘,结果都是无穷(区分符号);
      • 任何非0NaN且非无穷数值除以无穷,结果都是0;反之则是无穷;
      • 0乘以无穷,结果为NaN;其他运算则同上;
      • 无穷减去或是除以无穷,结果为NaN
      • null在计算中会被转换为0,等同于0与无穷的计算规则;
      • undefined与无穷计算,结果都为NaN

    如下各图:

    792a2651d3a8ae900014c7997621ce29.png

    99871bf4fa77bf077425d141a1a991a0.png

    e8f1755bf5c709ba27099c3e6040a678.png

    c5efd5971b6612e634b5456b47945096.png

    83657cea7c11c4b9351a2b7d43613ddf.png
    • NaN

    上面频繁的看到这个奇怪的数值NaN,它是JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合,以及一些数学运算会出现错误的场合,尤其是0 / 0

    3a442c2378234b2f1816b84aca3a4df6.png

    NaN不等于任何数值,包括它本身,这也就意味着无法通过比较运算符来判断NaN

    e96ad77e5e2ed1ff4500fb780470c375.png

    与任何数值的计算结果,都是NaN

    6fc24bad8918f8e593f7f403a51be90d.png

    由于数值正向溢出(overflow)、负向溢出(underflow)和被0除,JavaScript 都不报错,所以单纯的数学运算几乎没有可能抛出错误。


    3. 数值相关的全局方法

    3.1 parseInt()

    parseInt()这个方法,主要是用于将字符串转换为整数,直接把需要转换的字符串(变量)作为方法的参数放入括号内即可:

    parseInt

    c1f84d5c8ede5a2ca9fe3b4716a8a1a5.png

    内部处理方式:

    • 当字符串头部有空格的时候,会自动去除:

    f203d8be5554d8162594d4aa466ef94d.png
    • 如果待转换对象不是字符串,则会先转换为字符串,再转换为整数:

    5154119c169381f1bac3e0d0d2e99730.png
    • 在转换过程中,会按照字符串的字符顺序依次转换,一旦遇到无法转换为数字的字符,就会停止转换进程,直接返回已转换的所有数字:

    6916a89fdf41c5a9c321c3934c0b12b0.png
    • 如果第一个就是无法转换的字符,则不进行任何转换动作,并返回NaN

    3b6eba722f0a83bef0b05bb1d2f9aeca.png
    • 该方法只会按照十进制进行转换,遇到0x开头的十六进制数字,也会转换为十进制整数:

    9c7910c9a4d89d763952a2d3f8612340.png
    • 对于所有以科学记数法表现的数值,或者会被自动转换为科学记数法的数值,该方法无法转换,并会出现奇怪的错误:

    1a7fe82bf907056e798d20e852d62789.png

    512f810521b409b56bb892f1a38e9856.png
    • 该方法可以接受第二个参数,将其他进制的整数转换为十进制数值,但该参数只接受2-36之间的数值,超过该范围,结果为NaN

    95263d48f18e11fcf52f71d6c886a146.png
    • 如果第二个参数是0null以及undefined,则会直接忽略,使用默认的10作为参数:

    8b254ef15a1547d91080c31629d07e7d.png

    使用该方法,最需要注意的,就是自动类型转换所造成的各种意料之外的结果。

    3.2 parseFloat()

    有了转换整数的方法,自然会有转换浮点数的方法,就是这个parseFloat()了。

    parseFloat

    5c3149adbc1d7f4dce9c1b9767a67dec.png

    内部处理方式:

    • 对字符串的处理和parseInt()一致:去除头部空格、先转换为字符串再转换为浮点数值、依照字符串字符次序处理等:

    c487d049f1a2c3abddc5f6f0bf6af3f8.png
    • 会将空字符串处理为NaN

    08d725fab364cf7fae57deaf3fe11878.png
    • 如果字符串符合科学计数法,则会进行相应的转换:

    cdf0a51f1f2ea63d734fb28cd98c3dd4.png

    3.3 isNaN()

    该方法本意是用来对非数值NaN进行判断,但由于设计上会对类型进行自动转换,字符串在转换后也会变成NaN,故而有可能需要判断的变量是字符串而不是原始的NaN

    2cc4787332da6e743c593857fbdb1a8b.png

    同理,数组和对象的判断结果也会是true;不过空数组或只包含一个数值成员的数组,则会转换为数值从而结果为false

    6641a124db8d922638b571e0fa400a5f.png

    故而为了避免得到不想要的结果,最好先判断一下变量的基础类型。

    建议一个更可靠的方法:利用NaN为唯一不等于自身的值的这个特点,进行判断。

    function 

    f8b21294cbc1c4480ec93964e6a69673.png

    3.4 isFinite()

    该方法返回一个布尔值,表示某个值是否为正常的数值。

    c2b2d7a75722638e8a13078947101db8.png

    除了Infinity-InfinityNaNundefined这几个值,isFinite()对于其他的数值都会返回true

    展开全文
  • 二进制字符串类型 MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。 MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 ...

    二进制字符串类型

    • MySQL中的二进制字符串类型主要存储一些二进制数据,比如可以存储图片、音频和视频等二进制数据。

    • MySQL中支持的二进制字符串类型主要包括BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB类型。

    1. BINARY与VARBINARY类型

    • BINARY和VARBINARY类似于CHAR和VARCHAR,只是它们存储的是二进制字符串。

    • BINARY (M)为固定长度的二进制字符串,M表示最多能存储的字节数,取值范围是0~255个字符。如果未指定(M),表示只能存储1个字节。例如BINARY (8),表示最多能存储8个字节,如果字段值不足(M)个字节,将在右边填充’0'以补齐指定长度。

    • VARBINARY (M)为可变长度的二进制字符串,M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,另外还要考虑额外字节开销,VARBINARY类型的数据除了存储数据本身外,还需要1或2个字节来存储数据的字节数。VARBINARY类型必须指定(M),否则报错。

    二进制字符串类型特点值的长度占用空间
    BINARY(M)固定长度M (0 <= M <= 255)M个字节
    VARBINARY(M)可变长度M(0 <= M <= 65535)M+1个字节

    举例:

    创建表:

    CREATE TABLE test_binary1(
    f1 BINARY,
    f2 BINARY(3),
    # f3 VARBINARY,
    f4 VARBINARY(10)
    );
    

    在这里插入图片描述

    添加数据:

    INSERT INTO test_binary1(f1,f2)
    VALUES('a','a');
    

    在这里插入图片描述

    • 添加失败,因为一个汉字占两个字节

    在这里插入图片描述

    • 添加成功,因为 f2 长度是3个字节
      在这里插入图片描述

    • 添加成功,因为一个字母占一个字节

    INSERT INTO test_binary1(f1,f2)
    VALUES('a','abc');
    

    在这里插入图片描述

    INSERT INTO test_binary1(f2,f4)
    VALUES('ab','ab');
    

    在这里插入图片描述

    在这里插入图片描述

    2. BLOB类型

    • BLOB是一个二进制大对象,可以容纳可变数量的数据。

    • MySQL中的BLOB类型包括TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 4种类型,它们可容纳值的最大长度不同。可以存储一个二进制的大对象,比如图片音频视频等。

    • 需要注意的是,在实际工作中,往往不会在MySQL数据库中使用BLOB类型存储大对象数据,通常会将图片、音频和视频文件存储到服务器的磁盘上,并将图片、音频和视频的访问路径存储到MySQL中。

    二进制字符串类型值的长度长度范围占用空间
    TINYBLOBL0 <= L <= 255L + 1 个字节
    BLOBL0 <= L <= 65535(相当于64KB)L + 2 个字节
    MEDIUMBLOBL0 <= L <= 16777215 (相当于16MB)L + 3 个字节
    LONGBLOBL0 <= L <= 4294967295(相当于4GB)L + 4 个字节

    举例:

    CREATE TABLE test_blob1(
    id INT,
    img MEDIUMBLOB
    );
    
    INSERT INTO test_blob1(id)
    VALUES (1001);
    
    SELECT *
    FROM test_blob1;
    

    在这里插入图片描述

    TEXT和BLOB的使用注意事项:

    在使用textblob字段类型时要注意以下几点,以便更好的发挥数据库的性能。

    ① BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不同。为了提高性能,建议定期使用 OPTIMIZE TABLE 功能对这类表进行碎片整理

    ② 如果需要对大文本字段进行模糊查询,MySQL 提供了前缀索引。但是仍然要在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT * 查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,可能毫无目的地在网络上传输大量的值。

    ③ 把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行 SELECT * 查询的时候不会通过网络传输大量的BLOB或TEXT值。

    展开全文
  • 给定0和1的二进制矩阵。找到1的最长序列(按行或按列)。 例如: 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 它应该返回最高计数– 3。
  • 很明显我们直到,二进制运算对2取余就是当前,除于2就是进位。 比如: 0+0=0;进位为0,当前为0; 0+1=1;进位0,当前为1; 1+1=10;进位为1,当前为0; 从后往前运算,每次从a和b各取一个数字和进位相加...

    题目描述

    在这里插入图片描述
    题目简单明了,我们直接给题解。

    常规解法

    在这里插入图片描述

    在这里插入图片描述
    看上图:
    很明显我们直到,二进制运算对2取余就是当前位,除于2就是进位。
    比如: 0+0=0;进位为0,当前位为0;
    0+1=1;进位位0,当前位为1;
    1+1=10;进位为1,当前位为0;
    从后往前运算,每次从a和b各取一个数字和进位相加;每次得到的当前位的结果,拼接起来,进位放在下一位运算。

                ans.append(sum % 2);
                //除二为进位
                ca = sum / 2;
    

    如果一个字符串已经运算完,另一个还没有运算完,就将已经运算玩的哪的二进制设位0,进行运算,

                //i>0 代表a没遍历完,就让a等于它本来的值,否则就等于0
                sum += i >= 0 ? a.charAt(i) - '0' : 0;
                sum += j >= 0 ? b.charAt(j) - '0' : 0;
    

    最后当两个都遍历完,如果进位位1,就将其拼接起来。最后将所拼接的字符串反转就是我们所得的结果。

    代码:

    public static String addBinary2(String a, String b) {
    
            //定义一个StringBuilder用来拼接结果
            StringBuilder ans = new StringBuilder();
    
            //初始化进位为0,
            int ca = 0;
            //直到两个字符串都遍历完为止
            for (int i = a.length() - 1, j = b.length() - 1; i >= 0 || j >= 0; i--, j--) {
                //sum = ca + a + b
                int sum = ca;
                //i>0 代表a没遍历完,就让a等于它本来的值,否则就等于0
                sum += i >= 0 ? a.charAt(i) - '0' : 0;
                sum += j >= 0 ? b.charAt(j) - '0' : 0;
                //结果是对二取余数
                ans.append(sum % 2);
                //除二为进位
                ca = sum / 2;
            }
            //遍历完如果进位为1,就将一加到后面
            ans.append(ca == 1 ? ca : "");
            //最后对字符串进行反转
            return ans.reverse().toString();
        }
    

    位运算

    首先我们先说一下:

    位运算加法是用异或 ^:
    相同为0,不同为1
    0 ^ 0 结果为0
    0 ^ 1 结果为1
    1 ^ 1 结果为0,因为进位了
    进位用and也就是与运算&
    只有同时为1是才为1
    0 & 0 结果为0
    0 & 1 结果为0
    1 & 1 结果为1

    首先看图解:
    在这里插入图片描述

    在这里插入图片描述

    首先初始化一个字符数组,长度为a和b最长的那个+1,因为有可能会有进位。将这和字符数组初始化为全‘0’数组

    char[] rs = new char[Math.max(a.length(), b.length()) + 1];
            //将其初始化位0
            for (int i = 0; i < rs.length; i++) {
                rs[i] = '0';
            }
    

    定义两个数组max,min,分别存两个字符串。

    char[] max = (a.length() >= b.length() ? a : b).toCharArray();
            char[] min = (a.length() >= b.length() ? b : a).toCharArray();
    

    将短的那个赋值给我们定义字符数组

    //将短的赋给rs
            for (int i = 0; i < min.length; i++) {
                rs[rs.length - 1 - i] = min[min.length - 1 - i];
            }
    

    然后max和re从后往前逐位进行运算

    int carry = 0;
            //诸位进行运算
            for (int i = 0; i < max.length; i++) {
    
                int left = rs[rs.length - 1 - i] == '0' ? 0 : 1;
                int right = max[max.length - 1 - i] == '0' ? 0 : 1;
    
                int v = left ^ right ^ carry;
                carry = (left & right) + ((left ^ right) & carry);
    
                rs[rs.length - 1 - i] = v > 0 ? '1' : '0';
    
            }
    

    最后将carry放在第一位即可

    //进位大于一 就加个一
            if (carry > 0) {
                rs[0] = '1';
                return new String(rs);
            } else {
                rs[0] = ' ';
                return new String(rs).trim();
            }
    

    最后关于其中位运算代码,在作以解释

    int v = left ^ right ^ carry;
    

    异或可以进行多位运算,等同于加法。
    可以计算作为验证

     carry = (left & right) + ((left ^ right) & carry);
    

    计算进位
    对于left & right(left ^ right) & carry
    他们两个的结果不可能同时为1,大家可以自己运算。
    我们讲讲为什么要这么算进位
    当不算进位,两个数都为0的时候,不论进位值为几,这几个数相加都不可能产生进位。left & right(left ^ right)都为0,所以与carry无关。
    当两个同时为1时一定产生进位,左边已经为1,但(left ^ right)为0,与进位无关。所以最后的进位结果是1;
    当两个数一个为0一个为1时,加号左边为0,(left ^ right)为1,此时与carry有关,当carry为1,时会产生进位,当carry为0时不产生进位,所以时&carry。

    完整代码:

    //初始话一个最大长度+1的字符数组,因为最后可能产生进位,所以加一
            char[] rs = new char[Math.max(a.length(), b.length()) + 1];
            //将其初始化位0
            for (int i = 0; i < rs.length; i++) {
                rs[i] = '0';
            }
            //max等于长的字符串,min等于短的字符串
            char[] max = (a.length() >= b.length() ? a : b).toCharArray();
            char[] min = (a.length() >= b.length() ? b : a).toCharArray();
            //将短的赋给rs
            for (int i = 0; i < min.length; i++) {
                rs[rs.length - 1 - i] = min[min.length - 1 - i];
            }
    
            int carry = 0;
            //诸位进行运算
            for (int i = 0; i < max.length; i++) {
    
                int left = rs[rs.length - 1 - i] == '0' ? 0 : 1;
                int right = max[max.length - 1 - i] == '0' ? 0 : 1;
    
                int v = left ^ right ^ carry;
                carry = (left & right) + ((left ^ right) & carry);
    
                rs[rs.length - 1 - i] = v > 0 ? '1' : '0';
    
            }
            //进位大于一 就加个一
            if (carry > 0) {
                rs[0] = '1';
                return new String(rs);
            } else {
                rs[0] = ' ';
                return new String(rs).trim();
            }
    
    
    展开全文
  • 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,...
  • 首先明确一点,我想要的结果是这个数字经过进制转换得到一个二进制数组,且最长不超过n。这里的n是可以调的,下面给出n=8时的例子。 public static String binaryString(int num) { StringBuilder result = ...
  • 给你一个整数 n ,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的 十进制 数字对 10^9 + 7 取余的结果。 示例 1: 输入:n = 1 输出:1 解释:二进制的 “1” 对应着十进制的 1 。 示例 2: 输入:n = 3...
  • 整数部分以3一组,最高有效不足3时以0补齐,每一组均可转换成一个八进制的值,转换完毕就是八进制的整数。 小数部份从最高有效开始,以3一组,最低有效不足3时以0补齐,每一组均可转换成一个八进制的...
  • #include <...//二进制数字连续数字1最长长度 int max_cur() { int n; cin >> n; int max = 0; while (n) { int count = 0; while ((n & 1) == 1) { count++; n...
  • C 语言实例 – 八进制与二进制相互转换八进制与二进制相互转换。实例 - 二进制转换为八进制#include #include int convertBinarytoOctal(long long binaryNumber);int main(){long long binaryNumber;printf("输入一...
  • Integer能表示十进制多少位

    万次阅读 2018-09-27 11:21:03
    在32机器上,能表示的最大值是2^32 = 4 294 967 296。 111111111111超过了最大表示范围,所以会报错。   超过了Integer的存值范围,Integer存值的范围是 -2的31次方 到 2的31次方-1 的常量   I...
  • C++ 二进制转十进制

    千次阅读 2020-10-29 18:10:51
    有好几万个二进制数,最长不超过64,请将其都转换成十进制数 输入描述 输入有多行!!每行包含一个长度不超过64位二进制数,最后一行输入-1表示输入结束 输出描述 对于每行二进制数,输出转换后的十进制数,每个数...
  • 给定一个二进制数组, 计算其中最大连续1的个数。 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两和最后的三都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。 输入数组的长度是正...
  • java实现输入一个整数,求其二进制中连续1的最大长度 例如:3的二进制为00000011,最大连续2个1。 分析:使用移位统计连续出现1的次数,每次统计完与前面的连续次数作比较比前面的大就更新。 import java.util....
  • 给你一个整数n,请你将1到 n的二进制表示连接起来,并返回连接结果对应的 十进制数字对 109+ 7取余的结果。 示例 1: 输入:n = 1 输出:1 解释:二进制的 "1" 对应着十进制的 1 。 示例 2: 输入:n = 3 输出:...
  • 文章目录写法1 :耿直模拟写法2 :二进制移位模拟   第一次 JS 双百,虽然是虚假的双百 ???? 写法1 :耿直模拟   使用 JS 中的进制转换函数 toString 和 parseInt 实现模拟。   toString 能将十进制数字转换...
  • 给你一个整数 n ,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的 十进制 数字对 10^9 + 7 取余的结果。 示例 1: 输入:n = 1 输出:1 解释:二进制的 "1" 对应着十进制的 1 。 示例 2: 输入:n = 3 ...
  • 给定一个长度为 nnn 的数列 aia_iai​,求 aia_iai​ 的子序列 bib_ibi​ 的最长长度 kkk,满足 $b_i & b_{i-1} \ne 0 $,其中 2≤i≤k2\leq i\leq k2≤i≤k, &\&& 表示运算取与。 输入格式 输入...
  • 886.二进制间距

    2022-04-24 23:51:47
    给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。 如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是...
  • 二进制与字符编码

    2021-11-14 18:07:51
    一:为什么计算机采用二进制 计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。所以计算机只能识别二进制。 二:什么是二进制 二进制是计算技术...
  • 请你返回 的 最长 子序列,且该子序列对应的 二进制 数字小于等于 。注意:示例 1: 输入:s = "1001010", k = 5 输出:5 解释:s 中小于等于 5 的最长子序列是 "00010" ,对应的十进制数字是 2...
  • 给定一个正整数 N,找到并返回 N 的二进制表示中两个连续的 1 之间的最长距离。 如果没有两个连续的 1,返回 0 。 示例 1: 输入:22 输出:2 解释: 22 的二进制是 0b10110 。 在 22 的二进制表示中,有三个 1,...
  • 从大量二进制文件中查找两个或多个文件之间相同的最长字节链的最佳解决方案 输入:10个给定的示例二进制文件的列表。 输出:出现在至少两个文件中的最长公共子字符串(字节链)。 -股线的长度-出现最大股线的...
  • 其基本形式如下:字符串类型(M),其中,‘字符串类型’参数指定了数据类型为binary类型还是varbinary类型,M参数指定了该二进制数的最大字节长度为M。这与char类型和varchar类型相似。举个例子,binary(10)就是指...
  • 全局定义一定不要丢了全局定义base = [str(x) for x in range()] + [ chr(x) for x in range(ord('A'),ord('A')+)]二进制 to 十进制 : int(str,n=)def bin2dec(string_num):return str(int(string_num, ))十六进制 ...
  • 二进制中0的个数

    千次阅读 2018-03-18 14:17:44
    师兄的一道网易面试题问题:求二进制0的个数,要求从第一为1往后统计个数答:主要考虑正负数情况。对于正数,在不为0的情况下,计算其2进制,容易得0的个数。对于负数,因为已知第一是1的,所以不用担心有高位0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,265
精华内容 26,506
热门标签
关键字:

二进制最长多少位