如何使用 mod 运算符对数字进行换行

发布于 2024-10-14 16:29:02 字数 240 浏览 7 评论 0原文

不确定这是否可能,但是是否有一种自动方法,使用 mod 或类似的东西来自动纠正错误的输入值?例如:

If r>255, then set r=255 and
if r<0, then set r=0

所以基本上我要问的是有什么聪明的数学方法来设置它而不是使用

if(r>255)
 r=255;
if(r<0)
 r=0;

Not sure if this is possible, but is there an automatic way, using mod or something similiar, to automatically correct bad input values? For example:

If r>255, then set r=255 and
if r<0, then set r=0

So basically what I'm asking is whats a clever mathematical way to set this rather than using

if(r>255)
 r=255;
if(r<0)
 r=0;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

热血少△年 2024-10-21 16:29:02

怎么样:

r = std:max(0, std::min(r, 255));

How about:

r = std:max(0, std::min(r, 255));
留蓝 2024-10-21 16:29:02

以下函数将输出您要查找的内容:

 f(x) = (510*(1 + Sign[-255 + x]) + x*(1 + Sign[255 - x])*(1 + Sign[x]))/4

如下所示:

在此处输入图像描述

The following function will output what you are looking for:

 f(x) = (510*(1 + Sign[-255 + x]) + x*(1 + Sign[255 - x])*(1 + Sign[x]))/4

As shown here:

enter image description here

空袭的梦i 2024-10-21 16:29:02

你能做一些类似的事情吗——

R = MIN(r, 255);
R = MAX(R, 0);

Could you do something like --

R = MIN(r, 255);
R = MAX(R, 0);
懵少女 2024-10-21 16:29:02

根据您的硬件以及解释器处理 int 的方式,您可以这样做:

假设无符号 int 是 16 位(为了保持掩码简短):

r = r & 0000000011111111;

如果 int 是 32 位,则需要 16 个以上的零位掩码的开始。

在按位 AND 之后,r 的最大值为 255。根据硬件的不同,无符号 int 可能会在给定低于零的值时执行一些奇怪的操作。我相信这种情况已经由位掩码处理了(至少在我使用的硬件上)。如果没有,您可以先执行 r = min(r, 0);

Depending on how your hardware and possibly how your interpreter deal with ints, you can do this:

Assuming that an unsigned int is 16 bits (to keep my masks short):

r = r & 0000000011111111;

If an int was 32 bits, you'd need 16 more zeros at the start of the bit mask.

After that bitwise AND, the maximum value r can have is 255. Depending on the hardware, an unsigned int might do something odd given a value below zero. I believe that case is already handled by the bitmask (at least on the hardware that I've used). If not, you can do r = min(r, 0); first.

无敌元气妹 2024-10-21 16:29:02

我在处理图像时遇到了类似的问题。对于某些特殊值(例如 0 和 255),您可以使用这种不可移植的方法:

static inline int trim_8bit(unsigned i){
    return 0xff & ((i | -!!(i & ~0xff))) + (i >> 31);
    // where "0xff &" can be omitted if you return unsigned char
};

在实际情况下,必须很少执行钳位,以便您可以编写

static inline unsigned char trim_8bit_v2(unsigned i){   
    if (__builtin_expect(i & ~0xFF, 0)) // it's for gcc, use __assume for MSVC
        return (i >> 31) - 1; 
    return i;
};

并确定哪个最快,进行测量。

I had similar problem when dealing with images. For some special values (like these ones, 0 and 255) you can use this nonportable method:

static inline int trim_8bit(unsigned i){
    return 0xff & ((i | -!!(i & ~0xff))) + (i >> 31);
    // where "0xff &" can be omitted if you return unsigned char
};

In real cases the clamping have to be performed rarely, so that you could write

static inline unsigned char trim_8bit_v2(unsigned i){   
    if (__builtin_expect(i & ~0xFF, 0)) // it's for gcc, use __assume for MSVC
        return (i >> 31) - 1; 
    return i;
};

And to be sure which is fastest, measure.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文