相关疑难解决方法(0)

为什么GCC在实现整数除法时使用乘以奇数的乘法?

我一直在阅读divmul组装操作,我决定通过在C中编写一个简单的程序来实现它们:

文件分割

#include <stdlib.h>
#include <stdio.h>

int main()
{
    size_t i = 9;
    size_t j = i / 5;
    printf("%zu\n",j);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后生成汇编语言代码:

gcc -S division.c -O0 -masm=intel
Run Code Online (Sandbox Code Playgroud)

但是看生成的division.s文件,它不包含任何div操作!相反,它通过位移和魔术数字来做某种黑魔法.这是一个计算代码片段i/5:

mov     rax, QWORD PTR [rbp-16]   ; Move i (=9) to RAX
movabs  rdx, -3689348814741910323 ; Move some magic number to RDX (?)
mul     rdx                       ; Multiply 9 by magic number
mov     rax, rdx                  ; Take only the upper 64 bits of the …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 integer-division

206
推荐指数
4
解决办法
1万
查看次数

检查一个数字是否可以被3整除

我需要找出一个数字是否可以被3整除而不使用%,/或者*.给出的提示是使用atoi()函数.知道怎么做吗?

division modulo integer-division

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

检查一个数字是否可以被3整除

编写代码以确定数字是否可被3整除.函数的输入是单个位,0或1,如果到目前为止接收的数字是可被3整除的数字的二进制表示,则输出应为1,否则零.

例子:

input  "0":       (0)  output 1
inputs "1,0,0":   (4)  output 0
inputs "1,1,0,0": (6)  output 1
Run Code Online (Sandbox Code Playgroud)

这是基于面试问题.我要求绘制逻辑门,但由于这是stackoverflow,我会接受任何编码语言.硬件实现的奖励点(verilog等).

部分a(简单):第一个输入是MSB.

b部分(稍微难一点):第一个输入是LSB.

c部分(困难):哪一个更快更小,(a)或(b)?(理论上不是Big-O意义上的,但实际上更快/更小.)现在采用较慢/较大的一个,并使其快/小与更快/更小的一个.

puzzle division modulo

18
推荐指数
5
解决办法
5万
查看次数

如何知道二进制数是否除以3?

我想知道二元系统中是否存在除以3的任何可分规则.

例如:在十进制中,如果数字总和除以3,则数字除以3.例如:15 -> 1+5 = 6 -> 6除以3,因此15除以3.

需要了解的重要一点是,我不会寻找能够这样做的代码.bool flag =(i%3 == 0); 不是我正在寻找的答案.我寻找人类容易做的事情,就像十进制定律一样.

algorithm math binary

13
推荐指数
1
解决办法
2万
查看次数

具有Core 2 CPU(SSSE3)的大缓冲区的popcount

我正在寻找在512或更多字节的大缓冲区上popcount的最快方法.我可以保证任何所需的对齐,缓冲区大小总是2的幂.缓冲区对应于块分配,因此通常位是全部设置,没有设置,或者大多数设置有利于缓冲区的"左",偶尔出洞.

我考虑过的一些解决方案是:

我对最快的解决方案感兴趣,它必须适用于属于core2或更近的32位x86芯片组.SSE和SIMD非常感兴趣.我将在以下四核CPU上进行测试:

matt@stanley:~/anacrolix/public/stackoverflow$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Core(TM)2 Quad CPU    Q6600  @ 2.40GHz
stepping        : 11
cpu MHz         : 1600.000
cache size      : 4096 KB
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4
apicid          : 0
initial apicid  : 0
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : …
Run Code Online (Sandbox Code Playgroud)

c optimization x86 assembly hammingweight

12
推荐指数
2
解决办法
8386
查看次数

有效地计算JavaScript中整数的位数

假设我有一个整数I,并希望以二进制形式得到1的计数.

我目前正在使用以下代码.

Number(i.toString(2).split("").sort().join("")).toString().length;
Run Code Online (Sandbox Code Playgroud)

有更快的方法吗?我正在考虑使用按位运算符.有什么想法吗?

注意: i在32位限制范围内.

javascript binary bit-manipulation

12
推荐指数
2
解决办法
6412
查看次数

检查号码的逻辑可以被3整除吗?

不使用%,/或*,我必须找到否.可以被3整除吗?

这可能是一个面试问题.

谢谢.

c math

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