相关疑难解决方法(0)

另一种在不使用"*"运算符的情况下将两个数相乘的方法

昨天我进行了一次有趣的采访,面试官问我一个经典问题:如何在不使用*运算符的情况下将Java中的两个数字相乘.老实说,我不知道这是采访带来的压力,但我无法提出任何解决方案.

面试结束后,我回到家中,通过SO轻松寻找答案.到目前为止,我发现了以下内容:

第一种方法:使用For循环

// Using For loop
public static int multiplierLoop(int a, int b) {
    int resultat = 0;
    for (int i = 0; i < a; i++) {
        resultat += b;
    }

    return resultat;
}
Run Code Online (Sandbox Code Playgroud)

第二种方法:使用递归

// using Recursion
public static int multiplier(int a, int b) {

    if ((a == 0) || (b == 0))
        return 0;
    else
        return (a + multiplier(a, b - 1));

}
Run Code Online (Sandbox Code Playgroud)

第三种方法:使用Log10

**// Using Math.Log10
public static double multiplierLog(int …
Run Code Online (Sandbox Code Playgroud)

java

24
推荐指数
4
解决办法
9562
查看次数

为什么在x86(-64)上有符号和无符号乘法不同的指令?

我认为2的补码的重点是对于有符号和无符号数字的操作可以采用相同的方式.维基百科甚至特别列出了多重作为其中一项有益的操作.那么为什么x86对每个都有单独的指令,mul并且imul?x86-64仍然如此吗?

x86 assembly x86-64 twos-complement

23
推荐指数
3
解决办法
1万
查看次数

理解汇编语言的mul和imul指令的问题

我正在通过paul caurterPC Assembly学习80386

  mul source
Run Code Online (Sandbox Code Playgroud)
  • 如果操作数是字节大小,则将其乘以AL寄存器中的字节,结果存储在AX的16位中.

精细.

  • 如果源是16位,则将其乘以AX中的字,32位结果存储在DX:AX中.

Q1:为什么选择DX:AX?为什么它不能存储在EAX/EDX中?

imul 真是令人困惑

imul dest, source1
imul dest, source1, source2
Run Code Online (Sandbox Code Playgroud)

alt text http://img697.imageshack.us/img697/8976/imul.gif

我在理解表格方面遇到了问题.

Q2:在表的第2个条目中.再次,为什么DX:AX.为什么不EAX或EDX?

现在考虑以下代码片段:

imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx 
call print_int ;  prints the int stored in eax
call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

8
推荐指数
3
解决办法
2万
查看次数

为什么imul用于乘以无符号数?

我编译了以下程序:

#include <stdint.h>

uint64_t usquare(uint32_t x) {
  return (uint64_t)x * (uint64_t)x;
}
Run Code Online (Sandbox Code Playgroud)

这拆解为:

 0: 89 f8                   mov    eax,edi
 2: 48 0f af c0             imul   rax,rax
 6: c3                      ret  
Run Code Online (Sandbox Code Playgroud)

但是imul用于乘以有符号数字的指令.那为什么用gcc呢?

/ edit:使用uint64_t程序集时类似:

0:  48 0f af ff             imul   rdi,rdi
4:  48 89 f8                mov    rax,rdi
7:  c3                      ret  
Run Code Online (Sandbox Code Playgroud)

x86 assembly unsigned x86-64 multiplication

8
推荐指数
1
解决办法
2339
查看次数

x86上的有符号和无符号算术实现

C语言有签名和无符号类型,如char和int.我不确定,它是如何在汇编级别实现的,例如在我看来,有符号和无符号的乘法会带来不同的结果,因此汇编执行无符号和有符号算术或仅执行一次,这在某种程度上是模拟的不同的情况?

c algorithm math x86 integer-arithmetic

4
推荐指数
2
解决办法
4261
查看次数

GCC和乘法指令

我在cygwin下的Windows 7机器上以32位模式使用GCC.我有以下功能:

  unsigned f1(unsigned x, unsigned y)
  {
      return x*y;
  }
Run Code Online (Sandbox Code Playgroud)

我希望代码执行无符号乘法,因此我希望它生成mul指令,而不是imul指令.我用以下命令编译程序:

 gcc -m32 -S t4.c
Run Code Online (Sandbox Code Playgroud)

生成的汇编代码是:

     .file   "t4.c"
     .text
     .globl  _f1
     .def    _f1;    .scl    2;  .type   32; .endef
_f1:
     pushl   %ebp
     movl    %esp, %ebp
     movl    8(%ebp), %eax
     imull   12(%ebp), %eax
     popl    %ebp
     ret
    .ident  "GCC: (GNU) 4.8.2"
Run Code Online (Sandbox Code Playgroud)

我相信生成的代码中有错误的乘法指令,但我发现很难相信GCC有这么简单的错误.请评论.

c x86 gcc

0
推荐指数
1
解决办法
286
查看次数