精华内容
下载资源
问答
  • 重新解释像我这样的假人:在三元组中“编码”两个二进制互斥数字(w& b == 0)的直接方法是:white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \int(format(w, 'b').replace('1','2'), base=3)...

    重新解释像我这样的假人:

    在三元组中“编码”两个二进制互斥数字(w& b == 0)的直接方法是:

    white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \

    int(format(w, 'b').replace('1','2'), base=3)

    以下是所有可能的2位变体:

    white_black_empty(0b00, 0b00) == 0

    white_black_empty(0b00, 0b01) == 1

    white_black_empty(0b01, 0b00) == 2

    white_black_empty(0b00, 0b10) == 3

    white_black_empty(0b00, 0b11) == 4

    white_black_empty(0b01, 0b10) == 5

    white_black_empty(0b10, 0b00) == 6

    white_black_empty(0b10, 0b01) == 7

    white_black_empty(0b11, 0b00) == 8

    通过观察int(格式(w,’b’).replace(‘1′,’2′),base = 3)实际上等于int的两倍(格式(w,’b’),base = 3) (例如,20220023 == 10110013 * 2),我们得到了@Mark Dickinson在上述评论中发布的解决方案:

    white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \

    int(format(w, 'b'), base=3)*2

    展开全文
  • 二进制数转换成八进制数: 方法:将整数部分从低位向高位每三位用一个等值的八进制数来替换,最后不足三位时在高位补0凑满三位; 小数部分从高位向低位每三位用一个等值的八进制数来替换,最后不足三位时在低位补0凑满...

           上节课我们学习了二进制转换十进制,那二进制与常用的八进制之间是如何互相转换的呢?下面我们先看看二进制与八进制的转换方法。

    二进制数转换成八进制数:

           方法:将整数部分从低位向高位每三位用一个等值的八进制数来替换,最后不足三位时在高位补0凑满三位; 小数部分从高位向低位每三位用一个等值的八进制数来替换,最后不足三位时在低位补0凑满三位。(为了方便同学们记忆我们可以使用4 2 1法,也就是三位二进制数中的1,对应421中的哪些数,我们把对应的421值进行求和。例如101其中的1对应4和1.所以4+1=5)

    6a70613642bdfe4a5ed3d0fe6a41d4d8.png

           那如果反过来把1位八进制数转换成3位二进制数怎么办呢?

           方法:把每一个八进制数字改写成等值的三位二进制数,并保持高低位的次序不变即可。(为了方便同学们记忆,我们可以把一个八进制数看看是421中哪些数或组合组成的,例如八进制的5是由4+1得来的,所以4和1对应1.2对应0,结果就是101)

    22907408fbddca1adb342bba8912ac05.png

            二进制与八进制的方法如果同学们掌握了421法,转换的速度还是很快的。下一节我们进行知识迁移,看一下二进制与十六进制之间互相转换。

    818a8f484e1c14c08cb80aa0ce3239a9.png

    本公众号介绍计算机基础知识及办公软件的使用方法,欢迎关注!

    展开全文
  • 二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的, 十进制转换成二进制 将十进制数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数,最后从下往上倒着写...

    二进制数与十进制数的转换

    聊二进制数的运算前,我们先看看二进制数的值与十进制数的值是如何相互转换的,
    十进制转换成二进制
    将十进制数除以2,得到的商再除以2,依次类推直到商为1时为止,然后在旁边标出各步的余数,最后从下往上倒着写出来,高位补零就可以成功转换成二进制。
    例如下图49的二进制数就是110001
    在这里插入图片描述
    二进制转换成十进制
    只需将二进制数的各数位的值和位权相乘,然后将相乘的结果相加即可,有木有感觉特别方便。
    在这里插入图片描述
    二进制数的符号位
    二进制数中表示负数值时,一般会把最高位作为符号位来使用,最高位为0代表正数,最高位为1代表负数。
    这时了解二进制的人可能就会疑问,既然最高位1代表负数,1是00000001,那-1应该是10000001,为什么是11111111呢?要解释这个我们要先引入“补数”的概念,因为计算机在做加减运算时其实内部只会做加法运算,所以为了表示负数,就用正数来表示负数,这就是负数的概念。得到补数的方法很简单,进行取反操作,将二进制数的各位数的数值由1变为0,0变为1,再将结果加上1就可以了。

    00000001——————1(十进制)
    先进行取反操作,之后再加上1
    11111110
    变成
    11111111——————-1(十进制)

    不信的同学还可以验证以下,就会发现8位二进制的-1+1刚好等于100000000,而计算机会直接忽略掉最高位溢出的那个数字,所以刚好是00000000了。

    二进制数的乘除运算

    二进制数的乘除运算有两种方法,要么先转化位十进制数进行运算之后再转换为二进制(想来有点麻烦),要么头铁直接用二进制数进行乘除运算。

    在这里插入图片描述
    二进制数111乘以1011,乘数1011的每一位分别与乘数相乘,得到111、1110、00000、111000,将其加起来,得到1001101,这便是二进制乘法最直接的解求过程;也可以将111转化为十进制数7,1011转化为十进制数11,显版然7乘以11等于77,再将十进制数77化为二进制数1001101,显然1x26+1x23+1x22+1x20=64+8+4+1=77,所求结果完全正确。——百度

    二进制数的移位运算

    移位运算可是二进制的门面招牌
    在这里插入图片描述

    移位运算指的是将二进制数值的各数位进行左右移位(shift=移位)的运算。移位有左移(向高位方向)和右移(向低位方向)两种。在一次运算中,可以进行多个数位的移位操作。在程序代码中<<这个运算符表示左移,>>这个运算符表示右移,

    int a=1;
    int b;
    b=a<<3;//b现在为8

    运算符左侧是被移位的值,右侧表示要移位的位数。看到这有些同学就会想到,这移了几位不多了几个空白处么,计算机这千年老怪早想好了,如果是左移运算的话,它就会在空出来的低位补0。如果是右移运算的话,就稍微有点特殊,因为存在两种情况,既可以填1也可以填0,这就是逻辑右移和算数右移的区别。

    当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0.类似于霓虹灯往右滚动的效果。这就称为逻辑右移。
    将二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1)。这就称为算数右移。例如负数就在最高位补1,正数就在最高位补0。
    在这里插入图片描述

    展开全文
  • Given two binary strings, return their sum (also a binary string). ...二进制数想加,并且保存在string中,要注意的是如何将string和int之间互相转换,并且每位相加时,会有进位的可能,会影响之后...

    Given two binary strings, return their sum (also a binary string).

    For example,
    a = "11"
    b = "1"
    Return "100".

    二进制数想加,并且保存在string中,要注意的是如何将string和int之间互相转换,并且每位相加时,会有进位的可能,会影响之后相加的结果。而且两个输入string的长度也可能会不同。这时我们需要新建一个string,它的长度是两条输入string中的较大的那个,并且把较短的那个输入string通过在开头加字符‘0’来补的较大的那个长度。这时候我们逐个从两个string的末尾开始取出字符,然后转为数字,想加,如果大于等于2,则标记进位标志carry,并且给新string加入一个字符‘0’。代码如下:

    解法一:

    public:
        string addBinary(string a, string b) {
            string res;
            int na = a.size();
            int nb = b.size();
            int n = max(na, nb);
            bool carry = false;
            if (na > nb) {
                for (int i = 0; i < na - nb; ++i) b.insert(b.begin(), '0');
            }
            else if (na < nb) {
                for (int i = 0; i < nb - na; ++i) a.insert(a.begin(), '0');
            }
            for (int i = n - 1; i >= 0; --i) {
                int tmp = 0;
                if (carry) tmp = (a[i] - '0') + (b[i] - '0') + 1;
                else tmp = (a[i] - '0') + (b[i] - '0');
                if (tmp == 0) {
                    res.insert(res.begin(), '0');
                    carry = false;
                }
                else if (tmp == 1) {
                    res.insert(res.begin(), '1');
                    carry = false;
                }
                else if (tmp == 2) {
                    res.insert(res.begin(), '0');
                    carry = true;
                }
                else if (tmp == 3) {
                    res.insert(res.begin(), '1');
                    carry = true;
                }
            }
            if (carry) res.insert(res.begin(), '1');
            return res;
        }
    }; 

    下面这种写法又巧妙又简洁,用了两个指针分别指向a和b的末尾,然后每次取出一个字符,转为数字,若无法取出字符则按0处理,然后定义进位carry,初始化为0,将三者加起来,对2取余即为当前位的数字,对2取商即为当前进位的值,记得最后还要判断下carry,如果为1的话,要在结果最前面加上一个1,参见代码如下:

    解法二:

    public:
        string addBinary(string a, string b) {
            string res = "";
            int m = a.size() - 1, n = b.size() - 1, carry = 0;
            while (m >= 0 || n >= 0) {
                int p = m >= 0 ? a[m--] - '0' : 0;
                int q = n >= 0 ? b[n--] - '0' : 0;
                int sum = p + q + carry;
                res = to_string(sum % 2) + res;
                carry = sum / 2;
            }
            return carry == 1 ? "1" + res : res;
        }
    };

    参考资料:

    https://discuss.leetcode.com/topic/8981/short-code-by-c

    本文转自博客园Grandyang的博客,原文链接:[LeetCode] Add Binary 二进制数相加

    ,如需转载请自行联系原博主。

    展开全文
  • 67. Add Binary 贴上代码,如何处理好进位是关键 class Solution { public: string addBinary(string a, string b) { string s = ""; int c = 0, i = a.size() - 1, j = b.size() - 1; ...
  • 1、取三合一法,即从二进制的小数点为分界点,32313133353236313431303231363533e58685e5aeb931333431366431向左(向右)每三位取成一位,接着将这三位二进制按权相加,得到的数就是一位八位二进制数,然后,按顺序...
  • 其方法与二进制转换成十进制差不多:按权相加法,即将八进制每位上的乘以位权(如8,64,512….),然后将得出来的再加在一起。 如将72.45转换为十进制。如图1所示来看看十进制转八进制,有两种方法:直接法与间接...
  • 首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制!1.什么是二进制?就是只有0 和 1 每当遇到值为2 就向前进一位。2.为什么计算机内部是二进制?这就要从硬件说起,计算机是如何储存数据的,要知道...
  • ##两位二进制数加法器 在上一节中,我们学习了全加器的原理并且进行了仿真,今天我们来做一个实例——两位二进制数的加法器。 由于全加器有三个输入,其中一个是由低位的进位输入进来的,但是最低位只有两个输入,...
  • 我们设A和B是两个相加二进制数,C是从下一位获得的进位,两书相加的和在该位的值为Sum,全加器的两个输出仍然是给上一位的进位Carry。 A–B--C Sum–Carry 0–0--0 0–0 0–0--1 1–0 ...
  • 1689. 十-二进制数的最少数目 传送门 传送门 题意 结题思路 # 思路1: # 第一眼以为是贪心,后面看答案不是贪心哦: # 找到字符串中最大的数,然后返回数值即可,下面证明合理性。 # 假设输入的是32: # 32= # 11+ ...
  • ##MATLAB之Simulink(四)##两位二进制数加法器在上一节中,我们学习了全加器的原理并且进行了仿真,今天我们来做一个实例——两位二进制数的加法器。相关文章:MATLAB之Simulink(三)全加器由于全加器有三个输入,其中...
  • 例如一个二进制的数1010101如何转换成十进制数呢? 把最后一位看做 2^0 依次将指数递增上去 再乘以每一位所对应的数字 最后相加就好了(以二进制的1010101为例) 2 . 八进制转十进制 把最后一位看做 8^0 依次将指数...
  • 如何理解二进制计算原理

    千次阅读 2019-04-01 22:34:32
    @如何理解二进制计算原理 二进制的计算本质上是补码与补码间的计算 将时钟看作一个实验的物体 时钟上的11看作是二进制中的七个一:1111111 时钟上的12看作是二进制中的七个零:0000000 以连接时钟上12与6的线为对称...
  • 一个和它按位取反结果相加二进制表示和一定是111····111,即二进制表示为-1. 因此: x + ~x = -1 => x + ~x + 1 = 0 => ~x + 1 = -x 6的补码 6的二进制表示: 0000 0000 0000 0000 0000 0000 0000 ...
  • 首先要了解计算机是如何将两数相加的 cpu只能接收到 0 1,所以我们采用二进制来解决这个问题 ** # 基础知识 ** 异或运算(对应二进制加法) 0 ^ 1 = 1 => 0 + 1 = 1 0 ^ 0 = 0 => 0 + 0 = 0 1 ^ 0 = 1 ...
  • 如何给定两个二进制字符串,返回他们的和(用二进制表示) 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” ...
  • 问:如何二进制数10010转化为十进制? 答:将二进制数的每一位单独乘以2的n-1次方然后相加 如:12^4=8 02^3=0 02^2=0 12^1=2 0*2^0=0 将以上的数相加后:8+0+0+2+0=10,即为10010的十进制数 问:将16该十进制数...
  • 谈CRC循环冗余校验的之前,先把二进制除法说一下,先回忆一下十进制之间的除法是如何运算的, 这个式子在做除法的时候满足了这几个条件: 从被除的最左边开始向右做除法 被除运算的两位永远比除数大 如果相减...
  • 一,二进制的算法 是将一个进行处于2得到的余数1,或0进行收集! 余数收集是从最下向上进行依次排列 ...而数据类型byte,short等等是如何通过二进制来进行? 以byte为例: byte是以一个字节为单位,...
  • &LeetCode67& 二进制求和

    2020-02-20 17:05:52
    题目 给定两个二进制字符串,返回他们...二进制数相加,并且保存在string中,要注意的是如何将string和int之间互相转换,并且每位相加时,会有进位的可能,会影响之后相加的结果。而且两个输入string的长度也可能会...
  • Easy! 题目描述: 给定两个二进制字符串,返回它们的和(用二进制表示)。 输入为非空字符串且只包含数字1和0。 示例1: 输入: a = "11", b = "1" ...二进制数相加,并且保存在string中,要注意的是如何将st...
  • 如何表示二进制数的正负呢 通常采用的方法是在二进制数的前面加一位符号位,符号位为0表示这个数是正数,符号位位1表示这个数位负数,这种形式的数就称为原码。 为什么需要二进制补码 在做减法时,如果两个数时用...
  • 数字进制转换

    2019-03-24 17:56:57
    二进制,八进制,十六进制如何转换成十进制 基本概念: 二进制:1,0序列 八进制:开头0 十六进制:开头0X,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(代表11,12,13,14,15) 每个位数乘上2/8/16的n次幂相加。 整数部分:从右到...
  • 而要实现二进制加法最关键的步骤就是如何实现进位和相加(仅停留与本位的不进位加法)。 1.用"与"来提取进位 由AND(与,下文皆称为AND)的运算性质可以得到只有当两个都为1时才能运算得1正好提取了进位,只要向左...
  • 67. 二进制求和

    2019-08-29 23:09:13
    如何相加是字符,如何相加是数字,需要搞清楚; (2) 首先让两个字符串等长,若不等长,在短的字符串前补零,否则之后的操作会超出索引。 然后从后到前遍历所有的位数,同位相加,这里有一个点,用的是字符相加,...
  • 二进制中1的个数

    2017-08-16 17:50:00
    如何快速的求一个数二进制表示时1的个数呢。 除了用n&(n-1)外,还可以用下面的这种方法。 1. 最开始把相邻奇位和偶数位相加 2. 然后相邻4位相加,相邻8为相加,相邻16为的相加。得到最后1的个数。 这种...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

二进制数如何相加