相关疑难解决方法(0)

为什么这是一个未定义的行为?

我对这个问题的回答是这个函数:

inline bool divisible15(unsigned int x) 
{
    //286331153 = (2^32 - 1) / 15
    //4008636143 = (2^32) - 286331153
    return x * 4008636143 <= 286331153;
}
Run Code Online (Sandbox Code Playgroud)

它完全适用于我的机器与VS2008编译器,但在这里它根本不起作用.

有没有人有想法,为什么我在不同的编译器上得到不同的结果? unsigned溢出不是未定义的行为.

重要提示:经过一些测试后,确认它比将除法的余数除以15更快.(但不是在所有编译器上)

c c++ undefined-behavior

59
推荐指数
2
解决办法
2555
查看次数

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

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

division modulo integer-division

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

快速可分性测试(2,3,4,5,...,16)?

什么是最快的可分性测试?比如说,给定一个小端架构和一个32位有符号整数:如何计算得非常快,一个数字可被2,3,4,5整除,......最多16?

警告:给定的代码仅为示例.每一行都是独立的!使用模运算的明显解决方案在许多处理器上都很慢,这些处理器没有DIV硬件(像许多ARM一样).有些编译器也无法进行这样的优化(例如,如果divisor是函数的参数或依赖于某些东西).

Divisible_by_1 = do();
Divisible_by_2 = if (!(number & 1)) do();
Divisible_by_3 = ?
Divisible_by_4 = ?
Divisible_by_5 = ?
Divisible_by_6 = ?
Divisible_by_7 = ?
Divisible_by_8 = ?
Divisible_by_9 = ?
Divisible_by_10 = ?
Divisible_by_11 = ?
Divisible_by_12 = ?
Divisible_by_13 = ?
Divisible_by_14 = ?
Divisible_by_15 = ?
Divisible_by_16 = if(!number & 0x0000000F) do();
Run Code Online (Sandbox Code Playgroud)

和特殊情况:

Divisible_by_2k = if(number & (tk-1)) do();  //tk=2**k=(2*2*2*...) k times
Run Code Online (Sandbox Code Playgroud)

c c++ math assembly bit-manipulation

34
推荐指数
9
解决办法
2万
查看次数

如何检查寄存器是否可被7整除?

我想检查寄存器ax的值是否可被7整除,余数= 0.我该怎么办?

math x86 assembly division

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