integer-arithmetic相关内容
假设我们有: a = 0b11111001; b = 0b11110011; 如果我们手写Addition和Multiplication,我们就会得到这个结果,我们不在乎它是否签名: a + b = 111101100 a * b = 1110110001011011 我知道乘法会使宽度加倍,加法可能会溢出: Why is imul used for multiplyin
..
假设我们有3个比特可以玩。我将在2的补码中表示正负3: +3 = 0b011 -3 = 0b101 执行加法时,当溢出发生时,您总是会遇到一个悬浮位(-3) + (+3): 1 0 1 + 0 1 1 ----- 1 0 0 0 但是减法(-3) - (+3)呢? 1 0 1 - 0 1 1 ----- 0 1 0 0b010为2,这不是我们预期为
..
我知道这样的话题被问了好几次,但我的问题是关于完整的 32 位 int 的溢出.例如: 11111111111111111111111111111111 +00000000000000000000000000000001 =00000000000000000000000000000000//溢出! 我发现 topic 有类似的问题,但是算法并不完美. 111111111111111111
..
是否有可能创建一个谓词 max/2 没有一个累加器,以便 max(List, Max) 当且仅是 true如果 Max 是 List(整数列表)的最大值? 解决方案 是的,你可以计算递归步骤之后之后的最大值.喜欢: max([M],M).% 具有一个元素的列表的最大值就是该元素.最大([H|T],M):-max(T,M1), % 先计算尾部的最大值.M 是最大值(H,M1).% 然后将实
..
我有 8 位 int zero = 0b00000000; 和 8 位 int one = 0b00000001;根据二进制算术规则, 0 - 1 = 1(从下一个有效位借用 1). 如果我有: int s = 零 - 一;s = -1;-1 = 0b1111111; 所有这些 1 是从哪里来的?没有什么可以借用的,因为 zero 变量中的所有位都是 0. 解决方案 这是一
..
之前今天我试图添加两个 ushorts,但我注意到我必须将结果转换回 ushort.我认为它可能已经变成了一个 uint(以防止可能的意外溢出?),但令我惊讶的是它是一个 int (System.Int32). 这是否有一些巧妙的原因,或者可能是因为 int 被视为“基本"整数类型? 示例: ushort a = 1;ushort b = 2;ushort c = a + b;//
..
C 语言有 char 和 int 等有符号和无符号类型.我不确定它是如何在程序集级别实现的,因为例如,在我看来,有符号和无符号的乘法会带来不同的结果,所以汇编做两个未签名和签名算术或只有一个,这在某种程度上模拟不同的情况? 解决方案 如果你查看 x86 的各种乘法指令,只查看 32bit 变体而忽略 BMI2,你会发现这些: imul r/m32(32x32->64 有符号乘法)
..
我有这个 Bash 脚本,但我在第 16 行遇到了问题.如何获取第 15 行的先前结果并添加到第 16 行的变量? #!/bin/bash数量=0元=0对于 ((i=1; i 解决方案 对于整数: 使用算术展开:$((EXPR)) num=$((num1 + num2))num=$(($num1 + $num2)) # 也可以num=$((num1 + 2 + 3)) # ...nu
..
我有一个嵌入式 16 位 CPU.在这台机器上,整数是 16 位宽,它支持 32 位宽的长整数.我需要做一些需要以 64 位存储的乘法(例如,将 32 位数字乘以 16 位数字).我怎样才能在给定的约束下做到这一点?我没有数学库来做这件事. 解决方案 C 中的建议.请注意,使用内联汇编器可能更容易实现此代码,因为 C 中的进位检测似乎并不那么容易 //将 typedef 更改为编译器所期
..
我正在尝试自学 x86,但我遇到了需要立即返回负数的情况: .text.align 4,0x90.globl _scheme_entry_scheme_entry:movl $-42, %eax退 当我打印这个函数的返回值时 (printf("%" PRIdPTR "\n", scheme_entry()),我得到一个无意义的数字: $ ./neg4294967254 我猜这是因为它是一个
..
ARM 处理器,例如,有一个 mul 指令,执行 32 位 x 32 位乘法并返回结果的最低有效 32 位.他们还有 umull 和 smull 指令,它们再次执行 32 位 x 32 位乘法,但返回完整的 64 位结果.umull 进行无符号乘法,smull 进行有符号乘法. 为什么没有必要将 mul 的未签名和签名版本分开?在 32 位 x 32 位乘法的情况下,大概在这两种情况下结果的
..
ARM 处理器,例如,有一个 mul 指令,执行 32 位 x 32 位乘法并返回结果的最低有效 32 位.他们还有 umull 和 smull 指令,它们再次执行 32 位 x 32 位乘法,但返回完整的 64 位结果.umull 进行无符号乘法,smull 进行有符号乘法. 为什么没有必要将 mul 的未签名和签名版本分开?在 32 位 x 32 位乘法的情况下,大概在这两种情况下结果的
..
我正在尝试自学 x86,但我遇到了需要立即返回负数的情况: .text.align 4,0x90.globl _scheme_entry_scheme_entry:movl $-42, %eax回复 当我打印这个函数的返回值时 (printf("%" PRIdPTR "\n", scheme_entry()),我得到一个无意义的数字: $ ./neg4294967254 我猜这是因为它是
..
例如我写在 TextBox1 4*5 或 3-2 如何让答案出现在同一个文本框中? 我试过了,但还是不行 Private Sub Button1_Click(sender As Object, e As EventArgs) 处理Button1.Clicktextbox1.text = val(textbox1.text)结束子 它只显示第一个数字 解决方案 这是一项
..
为了获得 long[] 的确切总和,我使用了以下代码段. public static BigInteger sum(long[] a) {多头低价 = 0;多头高 = 0;for (final long x : a) {低 += (x & 0xFFFF_FFFFL);高 += (x > > 32);}返回 BigInteger.valueOf(high).shiftLeft(32).add(Bi
..
我正在为一个向前或向后移动索引的列表编写循环方法.以下代码用于向后循环: (i-1)%list_length 在这种情况下,i 是 usize 类型,这意味着它是无符号的.如果 i 等于 0,这会导致“尝试减法溢出"错误.我尝试使用正确的转换方法来解决此问题: ((i as isize)-1)%(list_length as isize)) as usize 这会导致整数溢出. 我明
..
它基本上返回了 box_needed.1 盒可装 10 件物品.因此,如果用户键入的项目是 102,则代码应返回 11 个框. 如果有非零余数,有没有办法向上舍入? 解决方案 对于您的用例,请使用整数算法.有一个简单的技术可以将整数地板除法转换为天花板除法: items = 102盒子大小 = 10num_boxes = (items + boxsize - 1)//boxsize
..
有一个相对知名的技巧可以取消设置一个最右边的位: y = x&(x-1)//0b001011100&0b001011011 = 0b001011000 :) 我发现自己有一个死循环来清除n个最右边的位,但是有没有更简单的代数技巧? 假定相对较大的n(对于64位整数,n必须小于64,但通常约为20-30). //x = 0b001011100 n = 2对于(auto i = 0;
..
为什么Rust的 u64 原语期望 u32 指数? 错误[E0308]:类型不匹配->src/protagonists.rs:13:25|13 |返回root.pow(self.secret)%素数;|预期的u32,找到的u64 ^^^^^^^^^^^^^帮助:您可以将u64转换为u32,如果转换后的值不合适,则可以恐慌 https://doc.rust-lang.org/std/primi
..
说我的程序中有一个非常关键的性能循环,需要检查点是否在矩形内,但是我知道在编译时下界始终为0,如下所示:(x> = 0& y> = 0&& x()或 union 类似)来消除前两个比较C ++),因为符号位可以保证任何负数都会变成一个 unsigned int ,其大小足以使边界检查失
..