- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我正在尝试编写代码来减去两个二进制数,但我不确定如何优雅地解决这个问题。保存二进制数的结构如下。
typedef struct _bitb {
short bit;
struct _bitb *nbit;
} BitB;
typedef struct _bignum {
short sign;
BitB *bits;
} BigNum;
因此,二进制数由包含其绝对值的位列表表示,从 LSB 到 MSB,然后是一个表示数字是正数还是负数的短字符(它是任意精度算术的实现)。如何在没有二进制补码的情况下从一个数字中减去另一个数字?
在有人问之前,这是为学校准备的,但我不想要代码中的解决方案,只想要一个我可以实现的通用算法。我一直在四处寻找,似乎没有一个好的算法可以解决一般情况。我是否需要检查数字的符号,然后为所有可能的情况(负负正、正负负、正负正、负负正)实现代码?或者我应该只转换为 2 的补码?
最佳答案
this is for school, but I don't want a solution in code, just a general algorithm that I can implement
BigNum
是整数的符号量级链表编码。
要加/减BigNum
,需要编写代码来加/减每个BitB
操作数的大小。
要增加量级,遍历 BitB
链表并边走边求和非常简单。
// pseudo-code
BitB *BitBAdd(const BitB *a, const BitB *b) {
BitB temp_head = set next member to NULL
BitB *bit_walker = pointer to the head
bool carry = false;
while (a is not end of list, b not end of list, or carry) {
bool abit = get bit from a if not NULL and advance a, else 0
bool bbit = get bit from b if not NULL and advance b, else 0
bit_walker->nbit = malloc(sizeof *(bit_walker->nbit));
check allocation success
advance bit_walker
set bit_walker->nbit members to NULL, abit ^ bbit ^ carry
carry = majority(abit, bbit, carry);
}
return temp_head.nbit;
}
幅度的减法需要先找到较大的幅度:int BitBCmp(const BitB *a, const BitB *b)
。代码未显示。减法函数 BitB *BitBCmp(const BitB *larger, const BitB *smaller)
类似于 BitBAdd()
。未显示。
一旦生成了 BitBAdd()
、BitBCmp()
和 BitBSub()
,那么 BigNum_Add()
和 BigNum_Sub()
可以按照 @user3386109 的建议通过检查符号并调用各种 BitB...()
来制作.
附带问题
BitBAdd()
代表完成 OP 任务所需代码的大约 20-25%。
可能需要去掉最重要的零位。还要考虑符号幅度编码可以生成 +0 和 -0。
关于c - 减去没有二进制补码的有符号二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52959258/
在取反数字符号的两个补码中,您通常只需取反每一位并加 1。 例如: 011 (3) 100 + 1 = 101 (-3) 在 VHDL 中是: a <= std_logic_vector(unsign
我有这个代码: package com.company; import java.net.InetAddress; import java.net.UnknownHostException; publ
这个问题在这里已经有了答案: How do I perform a bitwise NOT in SSE/AVX? (4 个答案) 关闭 5 年前。 在 AVX2 中似乎没有按位非/补的内在函数。我
我是初学者。我正在尝试获取存储在字符串中的二进制数的 2 的补码sou2_reg='000000000000000000000000000000011'。如果我执行 sou2_reg[32],它会给我
我决定这样做 翻转数字 0=1, 1=0 LSB加1 如果进位,循环直到array[i]==0 但我坚持最后一点;我怎么能在条件循环中这样说呢? 最佳答案 你在谈论扩展算术。大多数处理器都有来自每个加
前言 补码是给机器看的,原码是给人看的,反码是二者的桥梁,原码反码补码虽然是简单问题,但确实很多人很长时间没有搞明白和深入思考,这篇把自己学习和理解过程记录下来,刚好一个学妹问
我运行一个内部应用程序,使用 visual studio 2008 编程,使用 SQL Server 2008 作为后端。除了服务器之外,我的用户还要求能够将数据存储在独立的文件中。列举的原因包括:
UInt16 Checksum16Calculate(CHECKSUM_16_TYPE* pChecksum) { //calculate twos compliment of checksum pC
这是我目前正在做的家庭作业。我们要做的就是查看传递的 32 位 int x 并返回以 2 补码形式存储该值所需的最少位。 例如: howManyBits(0) = 1; howManyBits(-1)
我想对 sum+ 中的任何位进行 1s 补码,并将补码的位保存在 finalsum 中。怎么做。我对使用 bitvec 和 uint32_t 类型的东西有点虚弱。所以我在这里很困惑。请帮忙。 #inc
我找到的所有关于如何找到 1(翻转正二进制位)和 2(翻转正二进制位并加 1)补码的答案似乎都没有回答我的问题。 我的家庭作业要求找到负数的补码。因此,我不是从正数开始,而是需要找出它的负数是什么,而
我正在用 C 语言编写一个模拟器,我想让 constantValuable ,即 65530 (0xFFFA) 成为 5 的二进制补码变量,但我似乎不太正确。下面是我希望完成此操作的 if 语句的示例
我正在使用 Visual Studio 2013。 最近我尝试了 ~ 运算符来求 1 的补码: int a = 10; cout << ~a << endl; 输出为-11 但是为了 unsigned
我这里有一个主题,来自“数字系统”,主题为“计算机组织与体系结构简介” 然后我遇到了这个主题,“自我补充代码” 它分为三个部分,如下所示: i)多余3(我理解这一部分,因为它要求我们在BCD中加3)
我有 -9 作为一个整数,我如何将其转换为 C 中的 5 位 2 补码整数?本质上是得到 10111? 我当前的代码是什么样的: char src2[3] = "-9"; int int_src2 =
The dataFile.bin is a binary file with 6-byte records. The first 3 bytes of each record contain the
我是一名优秀的程序员,十分优秀!