一个直接的方法是
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)
有没有更优化的方法?
我有兴趣在添加无符号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] = 0x70和m2[i] = 0x10,然后m3[i] = 0x80和mask[i] = 0xFF,这显然不是我的要求.
使用VS2012.
我希望采用另一种方法来执行此操作.谢谢!
我对以下代码段感到困惑:
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呢?
我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:
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可能是负数.
考虑以下场景:
我有 2 个常量MAX & MIN
我得到一个新号码x
现在检查 x 是否在给定的愤怒中,我会做这样的事情:
if(x >= MIN && X <= MAX)
{
//Some logic
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来谈论效率。我确实知道这是一项非常简单的任务,但我只是想知道是否有更好的方法
这是一个类似的问题,以最快的方式来确定一个整数是否在两个整数(包括)与已知的值集之间,但由于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,但它正是我在尝试优化时开始前进的地方.
x86 ×3
assembly ×2
c++ ×2
optimization ×2
algorithm ×1
c ×1
c# ×1
intrinsics ×1
masm ×1
nasm ×1
php ×1
signedness ×1
simd ×1
sse ×1