相关疑难解决方法(0)

快速检查两个 int32_t 之间的差异是 1 还是 0

一个直接的方法是

uint32_t diff = abs(num1 - num2);
bool isZeroOrOne = (diff == 0 || diff == 1);
Run Code Online (Sandbox Code Playgroud)

或者简单地检查所有可能的情况:

int32_t diff = num1 - num2;
bool isZeroOrOne = (diff == 0 || diff == 1 || diff == -1);
Run Code Online (Sandbox Code Playgroud)

有没有更优化的方法?

c c++

5
推荐指数
1
解决办法
369
查看次数

SSE2内在函数 - 比较无符号整数

我有兴趣在添加无符号8位整数时识别溢出值,并将结果饱和到0xFF:

__m128i m1 = _mm_loadu_si128(/* 16 8-bit unsigned integers */);
__m128i m2 = _mm_loadu_si128(/* 16 8-bit unsigned integers */);

__m128i m3 = _mm_adds_epu8(m1, m2);
Run Code Online (Sandbox Code Playgroud)

我会感兴趣的是执行比这些无符号整数更少的比较,类似于_mm_cmplt_epi8签名:

__m128i mask = _mm_cmplt_epi8 (m3, m1);
m1 = _mm_or_si128(m3, mask);
Run Code Online (Sandbox Code Playgroud)

如果"epu8"等效可用,mask必须0xFF在那里m3[i] < m1[i](溢出!) 0x00 otherwise,我们将能够饱和m1使用"或",所以m1将持有另外的结果,其中有效的,0xFF它溢出.

问题是,_mm_cmplt_epi8执行符号比较,因此,例如,如果m1[i] = 0x70m2[i] = 0x10,然后m3[i] = 0x80mask[i] = 0xFF,这显然不是我的要求.

使用VS2012.

我希望采用另一种方法来执行此操作.谢谢!

c++ x86 sse simd intrinsics

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

x86汇编中的冲突符号:movsx然后是unsigned compare/branch?

我对以下代码段感到困惑:

movsx   ecx, [ebp+var_8] ; signed move
cmp     ecx, [ebp+arg_0]
jnb     short loc_401027 ; unsigned jump
Run Code Online (Sandbox Code Playgroud)

这似乎有冲突.Var_8似乎是在签名扩展帐户上签名的.然而,jnb暗示var_8未在帐户上签名,它是无符号的比较.

那么,var_8是签名还是未签名?那么arg_0呢?

x86 assembly masm micro-optimization signedness

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

x86装配 - 夹紧rax优化到[0 ..极限)

我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:

if rax < 0 then rax := 0 else if rax >= r12 then rax := r12 - 1

这是我天真的实施:

cmp rax, 0
jge offsetXGE
   mov rax, 0
   jmp offsetXReady
offsetXGE:
   cmp rax, r12
   jl offsetXReady
   mov rax, r12
   dec rax
offsetXReady:
Run Code Online (Sandbox Code Playgroud)

任何想法都是受欢迎的,即使是那些使用MMX和一些掩盖技巧的想法.

编辑:回答评论中的一些问题 - 是的,我们可以假设r12> 0但rax可能是负数.

optimization x86 assembly nasm

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

检查数字是否在给定范围内的有效方法

考虑以下场景:

  • 我有 2 个常量MAX & MIN

  • 我得到一个新号码x

现在检查 x 是否在给定的愤怒中,我会做这样的事情:

if(x >= MIN && X <= MAX)
{
   //Some logic
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更好的方法来谈论效率。我确实知道这是一项非常简单的任务,但我只是想知道是否有更好的方法

c# algorithm

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

有没有比PHP中的x> = start && x <= end更快的方法来测试整数是否在两个整数之间?

这是一个类似的问题,以最快的方式来确定一个整数是否在两个整数(包括)与已知的值集之间,但由于php不是严格键入的,因此接受的答案在php中不起作用(据我所知)没有可控整数溢出.

这里的用例是确定整数是否介于65和90之间("A"和"Z"的ASCII值).这些界限可能有助于优化解决方案,因为64是2的幂并且充当该问题的边界条件.

到目前为止我唯一提出的伪优化是:

//$intVal will be between 0 and 255 (inclusive)
function isCapital($intVal)
{
    //255-64=191 (bit mask of 1011 1111)
    return (($intVal & 191) <= 26) && (($intVal & 191) > 0);
}
Run Code Online (Sandbox Code Playgroud)

与普通的双重比较相比,这个功能并没有太大的改进(可能更慢)$intVal >= 65 && $intVal <= 90,但它正是我在尝试优化时开始前进的地方.

php optimization

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

标签 统计

x86 ×3

assembly ×2

c++ ×2

optimization ×2

algorithm ×1

c ×1

c# ×1

intrinsics ×1

masm ×1

micro-optimization ×1

nasm ×1

php ×1

signedness ×1

simd ×1

sse ×1