给定一个实数(n),这个实数可以是(上)的最大值,这个实数可以是(更低)的最小值,我们怎样才能最有效地剪切n,使它保持在低位和高位之间?
当然,使用一堆if语句可以做到这一点,但那很无聊!更紧凑,优雅/有趣的解决方案呢?
我自己的快速尝试(C/C++):
float clip( float n, float lower, float upper )
{
n = ( n > lower ) * n + !( n > lower ) * lower;
return ( n < upper ) * n + !( n < upper ) * upper;
}
Run Code Online (Sandbox Code Playgroud)
我确信还有其他更好的方法可以做到这一点,这就是为什么我把它放在那里......!
我想验证一个数组的所有elemnent.如果元素低于某个值,则按最小值进行交换,如果该值高于某个值,则按最大值进行交换.
但我不知道如何优化它.为了做到这一点,我逐个元素,逐个元素,但它没有优化,它在非常大的数组中花费了大量的CPU时间.
这是我的代码示例:
#include <iostream>
#include <math.h>
const int MAX = 10;
int main ()
{
float minVal = 2.0;
float maxVal = 11.0;
float vElem[] = {-111111.0/0.0, 10.0, 90.0, 8.0, -7.0,
-0.6, 5.0, 4.0, 33.0, 222222222.0/0};
for(int i=0; i<MAX; i++){
if(isinf(vElem[i])==-1 || vElem[i]<minVal) vElem[i] = minVal;
if(isinf(vElem[i])==1 || vElem[i]>maxVal || isnan(vElem[i])) vElem[i] = maxVal;
std::cout << vElem[i]<< std::endl;
}
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的汇编程序,当然,它的目的是尽可能快.但是,位于最嵌套循环中的某个部分看起来并不"正确",我相信有可能提出更聪明,更快速的实现,甚至可能不使用条件跳转.代码实现了一个简单的事情:
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可能是负数.
我试图确保int x
大于或等于0但小于1080(在这种情况下是屏幕尺寸).
我想出了这个
int x = 123;
x = std::min(std::max(x, 0), 1080);
Run Code Online (Sandbox Code Playgroud)
这看起来很难看.有没有更好的方法来实现这一目标?