精华内容
下载资源
问答
  • 二进制加法

    千次阅读 2013-11-30 18:38:22
    Problem 51: 二进制加法 Time Limit:1 Ms| Memory Limit:128 MB Difficulty:1 Description 计算机使用的是二进制,和十进制不同的是:二进制运算“逢二进一”。下面举几个二进制加法的运算实例: ...

    Problem 51: 二进制加法


    Time Limit:1 Ms| Memory Limit:128 MB
    Difficulty:1

    Description

    计算机使用的是二进制,和十进制不同的是:二进制运算“逢二进一”。下面举几个二进制加法的运算实例:
    例1(整数): 例2(含小数):
    11101 11101.1011
    + 110 + 110.11
    ------ -----------
    100011 100100.0111
    1所在的位置: 1所在的位置:
    6、2、1 6、3、-2、-3、-4

    你的任务是:对于任意的两个正的二进制数,求它们和中“1”所在的位置(其中小数点后面的位置用负数表示)。

    Input

    输入共两行:
    第一行:二进制的加数A,总长度<=200
    第二行:二进制的加数B,总长度<=200

    Output

    输出二进制数A+B中“1”所在的位置,位置排序为:整数部分从左到右:N、N-1、N-2...1,小数部分从左到右:-1、-2、......、-N,数据之间用空格分隔,行末没有多余的空格,有空行。

    Sample Input

    样例输入1:
    11101
    110

    样例输入2:
    11101.1011
    110.11

    Sample Output

    样例输出1:
    6 2 1

    样例输出2:
    6 3 -2 -3 -4

    Hint

    数据范围:
    40%的数据:A、B均为正整数,总长度<=31
    70%的数据:A、B含小数,小数位数相等,总长度<=200
    100%的数据:A、B可能含小数,小数位数可能不相等,总长度<=200

    思路:突然发现, 自己在字符串处理方面的功底实在是太差了, 这道题的思路主要是

    小数点的处理, 有一个 <string.h>里的strchr(), 可以很快找出字符串中的某一字符并返

    回其指针, 这样我们就可以求小数点所在位置的下标, 然后用两个数组pre[], aft[] 存储

    '.'之前和之后的数(这样最后显示1位置时较简单),然后就是注意一下小数数组 和整

    数数组的进位。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    char str1[500], str2[500];
    int pre[500], aft[500], left, right, temp[500];  //整数部分, 小数部分, 整数部分最左端, 小数部分最右端, 存放结果的数组
    
    int change(char str[])
    {
    	int len, i, j, pos, carry;
    	char *p;
    	len = strlen(str);
    	p = strchr(str, '.');         //找'.'的位置
    	if(p == NULL)                 //p = NULL 时为整数
    	{
    		pos = len;                
    	}
    	else
    	{
    		pos = p - str;            //求下标
    	}
    	for(i = pos - 1, j = 0; i >= 0; i--)
    	{
    		pre[j++] += (str[i] - '0');     //注意此处为+=
    	}
    	if(j > left)
    	{
    		left = j;
    	}
    	for(i = pos + 1, j = 0; i < len; i++)
    	{
    		aft[j++] += (str[i] - '0');      //同上
    	}
    	if(j > right)
    	{
    		right = j;
    	}
    	for(i = right+1; i >= 0; i--)
    	{
    		aft[i] += aft[i+1]/2;             //小数部分最终进位
    		aft[i+1] = aft[i+1]%2;		
    	}
    	pre[0] += aft[0]/2;                   //注意小数到整数的进位
    	aft[0] %= 2;
    	for(i = 1; i <= left+1; i++)
    	{
    		pre[i] += pre[i-1]/2;              //整数的进位
    		pre[i - 1] = pre[i - 1]%2;		
    	}
    	return 0;
    }
    
    int main()
    {
    	int i, t;
    	left = right = 0;
    	scanf("%s", str1);                     
    	scanf("%s", str2);
    	change(str1);                          //开始pre, aft都为0, 进行两次加
    	change(str2);
    	t = 0;
    	for(i = left+1; i >= 0; i--)
    	{
    		if(pre[i] == 1)
    		{
    			temp[t++] = i+1;                //找出并保存结果	
    		}
    	}
    	for(i = 0; i < right+1; i++)
    	{
    		if(aft[i] == 1)
    		{
    			temp[t++] = -(i+1);
    		}
    	}
    	for(i = 0; i < t-1; i++)
    	{
    		printf("%d ", temp[i]);              //打印结果,注意输出格式
    	}
    	printf("%d\n", temp[t-1]);
    	return 0;
    }


    展开全文
  • 标签:这两天看了《编码的奥秘》里面的二进制加法机及其后面的减法功能的实现,就用Python实现了一个类似功能的加法器出来。先说一下整体的思想。由于操作数都是二进制,所以计算简单了许多。首先,运算需要逐位操作...

    标签:

    这两天看了《编码的奥秘》里面的二进制加法机及其后面的减法功能的实现,就用Python实现了一个类似功能的加法器出来。

    先说一下整体的思想。

    由于操作数都是二进制,所以计算简单了许多。首先,运算需要逐位操作,两个二进制数相加使用AndGate即可,但是重点在于要区分出来“和”和“进位”,分别使用XorGate和AndGate实现, 这就搞定了半加器。然后,需要考虑右一位的进位,所以需要一个CI(carry in),然后将本位的sum和右一位的carry in再放到一个半加器里面。再然后,要想明白不管是一开始的两个数产生进位,还是由于后来得到了进位输入产生了进位,总之只可能只有一个进位,所以将两个半加器的CO(carry out)通过OrGate得到最终的进位,第二个半加器和就是最终的和。这就搞定了全加器。如下图:

    然后需要的就是把八个相同的连在一起就行了:

    减法的实现相对稍微复杂一点,因为减法存在借位,所以首要思想是,要以加法取代减法,所以对于a-b,需要将它替换为(a+(11111111-b)+1)-100000000 这样的形式,这样的话11111111-b就不会借位。然后就是如何搞定11111111-b,这需要求b的反码(也叫1的补数),即把1变0,0变1,实现上需要用到反向器,但是考虑到要和加法一起实现,所以需要使用一个XorGate并用一个标志SUB来标示是加法操作还是减法操作,也同样用来在最前面通过CI实现加1和在最后一步舍去最前面的1(具体过程请看书)。主要图示如下:

    到此为止,就全部搞定了。

    然后我以Python中函数的定义来代替逻辑门的定义,写了如下的加法器:

    1 #!/usr/bin/env python

    2

    3 defAnd(a, b):4 return int(a andb)5

    6 defOr(a, b):7 return int(a orb)8

    9 defNand(a, b):10 return int(notAnd(a, b))11

    12 defXor(a, b):13 returnAnd(Nand(a, b), Or(a, b))14

    15 defHalf_adder(a, b):16 s =Xor(a, b)17 co =And(a, b)18 returns, co19

    20 defFull_adder(a, b, ci):21 s, co1 =Half_adder(a, b)22 s, co2 =Half_adder(ci, s)23 co =Or(co1, co2)24 returns, co25

    26 def Eight_bit_adder(x, y, sub): #sub=0:add, sub=1:subtract

    27 y =list(y)28 for i inrange(len(y)):29 y[i] =Xor(sub, y[i])30 ans = [Full_adder(int(x[7]), int(y[7]), sub)]31 for i in range(6, -1, -1):32 ans.insert(0, Full_adder(int(x[i]), int(y[i]), ans[0][1]))33 ans.insert(0, (Xor(sub, ans[0][1]), None))34 for eachBit inans:35 printeachBit[0],36

    37 if __name__ == ‘__main__‘:38 print ‘Select an operator and enter two binary numbers to get their sum or diff‘

    39 o = raw_input(‘(A)dd / (S)ubtract:‘).strip().lower()[0]40 x = raw_input(‘x:‘)41 y = raw_input(‘y:‘)42 if o == ‘a‘:43 sub =044 elif o == ‘s‘:45 sub = 1

    46 Eight_bit_adder(x, y, sub)

    同时,实现减法一章最后讲到,如何使用二进制表示有符号数,也让我对计算机内部的世界更加了解。今天就先说到这里吧。

    标签:

    展开全文
  • 同歩二进制加法计数器3位同步二进制加法计数器如图所示。3位同步二进制加法计数器该计数器是一个3位同步二进制加法计数器,它由3个JK触发器和一个与门组成。与 异步计数器不同的是,它将计数脉冲同时送到每个触发器...

    同歩二进制加法计数器

    3位同步二进制加法计数器如图所示。

    7d661fbfd01732e5a8f628c0b4f1e0eb.png

    3位同步二进制加法计数器

    该计数器是一个3位同步二进制加法计数器,它由3个JK触发器和一个与门组成。与 异步计数器不同的是,它将计数脉冲同时送到每个触发器的CP端,计数脉冲到来时,各个触发器同时工作,这种形式的计数器成为同步计数器。

    334acc1598e5bf3003ab684de58a90ae.png

    数字计数器

    计数器的工作过程分为两步。

    第一步:计数器复位清零。

    在工作前应先对计数器进行复位清零。在复位控制端送一个负脉冲到各触发器Rd端, 触发器状态都变为“0",即Q2Q1Q0=000 。

    第二步:计数器开始计数。

    当第1个时钟脉冲的下降沿到来时,3个触发器同时工作。在时钟脉冲下降沿到来时, 触发器F。的J=K=1 (J、K悬空为“1”),触发器F0状态翻转,由“0”变为“1”;在时钟脉冲下降沿到来时,触发器F1的J=K=Q0=0 (注:在时钟脉冲下降沿刚到来时,触发器F0状态 还未变为“1”),触发器F1状态保持不变,仍为“0”;在时钟脉冲下降沿到来时,触发器F2 的

    J=K=Q0*Q1=0*0=0 (注:在时钟脉冲下降沿刚到来时,触发器F0、F1状态还未变化,均 为“0”),触发器F2状态保持不变,仍为“0”。第1个时钟脉冲过后,计数器的Q2Q1Q=OO1.

    83592d6d7c91c9e8d6189450988b5a70.png

    数字芯片

    同理,当第37个时钟脉冲下降沿到来时,计数器状态依次变为011、100, 101、110、 111;当再来一个时钟脉冲时,计数器状态又变为000。

    从上面的分析可以看出,同步计数器的各个触发器在时钟脉冲的控制下同时工作,计数速度快。如果将图中的Q0 Q1改接到Q0非 Q1非上,就可以构成同步二进制减法计数器。

    展开全文
  • 二进制整数的Java实现任意两个二进制数(不论在什么位置)相加,只可能出现4种情况。它们是:0+0=01+0=0+1=11+1=10=0+向高一位的进位11+1+1=11=1+向高一位的进位1//整数二进制相加public static String add(String b1,...

    二进制整数的Java实现

    任意两个二进制数(不论在什么位置)相加,只可能出现4种情况。它们是:

    0+0=0

    1+0=0+1=1

    1+1=10=0+向高一位的进位1

    1+1+1=11=1+向高一位的进位1

    //整数二进制相加

    public static String add(String b1, String b2) {

    int len1 = b1.length();

    int len2 = b2.length();

    String s1 = b1;

    String s2 = b2;

    StringBuffer sb1 = new StringBuffer();

    //先将位数较少的二进制高位补零

    if(len1 > len2) {

    for(int i = 0; i < (len1 - len2); i++) {

    sb1.append(0);

    }

    sb1.append(b2);

    s1 = b1;

    s2 = sb1.toString();

    } else if(len1 < len2) {

    for(int j = 0; j < (len2 - len1); j++) {

    sb1.append(0);

    }

    sb1.append(b1);

    s1 = sb1.toString();

    s2 = b2;

    }

    //进位

    int flag = 0;

    StringBuffer sb2 = new StringBuffer();

    for(int z = s1.length() - 1; z >= 0; z--) {

    //字符’0’的对应的ASCII十进制是48

    //分情况判断

    if((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 0) {

    sb2.append(flag);

    flag = 0;

    continue;

    }

    if(((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 0) || ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 0 && flag == 0)) {

    sb2.append(1);

    flag = 0;

    continue;

    }

    if(((s1.charAt(z) - 48) == 0 && (s2.charAt(z) - 48) == 1 && flag == 1) || ((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 0 && flag == 1)) {

    sb2.append(0);

    flag = 1;

    continue;

    }

    if((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 0) {

    sb2.append(0);

    flag = 1;

    continue;

    }

    if((s1.charAt(z) - 48) == 1 && (s2.charAt(z) - 48) == 1 && flag == 1) {

    sb2.append(1);

    flag = 1;

    }

    }

    if(flag == 1) {

    sb2.append(flag);

    }

    //倒置

    sb2.reverse();

    return sb2.toString();

    }

    测试

    public static void main(String[] args) {

    System.out.println(add("101", "011"));

    System.out.println(add("1001", "1011"));

    }

    0438982e9802f6647c2455832965cff3.png

    a192092e22b314cb5cf24015294ee31a.png

    展开全文
  • RNN训练二进制加法

    2018-09-08 10:42:01
    RNN训练二进制加法.py
  • C# RNN二进制加法

    2018-06-05 14:10:34
    网上很多用python写的RNN二进制加法代码,需要c#代码的同学可以下了看看,适合新手。 本人也是新手,互相学习。
  • 二进制整数的Java实现任意两个二进制数(不论在什么位置)相加,只可能出现4种情况。它们是:0+0=01+0=0+1=11+1=10=0+向高一位的进位11+1+1=11=1+向高一位的进位1//整数二进制相加public static String add(String b1,...
  • 本电路实现了同步三十二进制加法计数器的功能: 电路能准确地按照三十二进制加法计数的规律进行计数. 读者应深刻理解本例的分析和设计过程, 以为日后设计更为复杂的同步时序逻辑电路打下基础.
  • (1) 给定两个只含有0和1字符的字符串,实现二进制加法。如: String str1 = “101” String str2 = “11” 实现binarySum(String s1,String s2),使得输入以上字符时返回字符串"1000"。 拿到这个需求之后 开始是一脸...
  • 在像这样的二进制加法器可以用两个“半加法器”和一个“或”来完成首先是“半加器”,它是一个异或,给你一个求和输出,一个给你一个进位。在[按注释编辑:python确实有一个实现为^的异或,但不是像andnotor这样的...
  • C# RNN二进制加法_new

    2018-06-06 15:51:45
    网上很多用python写的RNN二进制加法代码,需要c#代码的同学可以下了看看,适合新手。 本人也是新手,互相学习。
  • 67 Add Binary 二进制加法leetcode题目描述方法1:方法2: 题目描述 Given two binary strings a and b, return their sum as a binary string. 中文:给定两个二进制的字符串,计算他们的加法和,结果以字符串返回 ...
  • 八位二进制加法

    千次阅读 2019-06-12 18:00:00
    二进制加法规则很简单,0+0=1,1+0=1,0+1=1,1+1=0,进一位,考虑一位二进制数加法的话,就会有两个输入,两个输出,则真值表如下: 之所以称之为半加器,是因为只做一位二进制加法,不考虑进位,它的设计很简单,...
  • 同歩二进制加法计数器3位同步二进制加法计数器如图所示。3位同步二进制加法计数器该计数器是一个3位同步二进制加法计数器,它由3个JK触发器和一个与门组成。与 异步计数器不同的是,它将计数脉冲同时送到每个触发器...
  • 二进制加法

    千次阅读 2019-03-11 20:53:13
    二进制加法表: + 0 1 0 00 01 1 01 10 第一位叫做进位位,第二位叫做加法位 这个表可以拆分成两个表: +加法 0 1 0 0 1 1 1 0 +进位 0 1 0 0 0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,635
精华内容 1,854
关键字:

二进制加法