一种基于最大值包装/溢出数字的算法
An algorithm to wrap/overflow number based on max value
有人来挑战吗?我正在寻找一种有效的算法来实现一个最大值固定的数字的换行/溢出行为。
例如,最大可能数值定义为:
#define MAX_NUMBER_VALUE 100
还有一个函数translate
,它取一个有符号的32位或64位整数值,并使用MAX_NUMBER_value常量"包装"它:
int_fast8_t translate(int_fast32_t value) {
if (abs(value) > MAX_NUMBER_VALUE) {
return ...; // This!
}
return value;
}
预期输入和输出:
translate(55) => 55
translate(100) => 100
translate(101) => -100
translate(102) => -99
translate(200) => -1
translate(202) => 1
translate(300) => 99
translate(-40) => -40
translate(-100) => -100
translate(-101) => 100
translate(-102) => 99
translate(-200) => 1
translate(-201) => 0
...
该值在数字周围"行走",就好像它是一颗圆形行星一样。这看起来确实类似于C/C++处理int溢出条件的方式。我想知道是否有一种快速有效的方法来实现这种包装?像移位或其他按位操作一样?
听起来您只是在描述%
运算符,并对负数进行了一些谨慎的处理。
int_fast8_t translate(int_fast32_t value) {
return sgn(value)*( (abs(value)+MAX)%(2*MAX+1)-MAX )
}
应该这样做,假设为int_fast32_t
型定义了模块划分
经过编辑,包括负数的处理,但现在看起来有点混乱。有关sgn(x(的智能实现,请参阅此
只要你的input + MAX_VALUE
小于有问题的积分类型的最大值,我认为你就可以使用它,甚至不需要初始的abs
检查:
return ((input + MAX_VALUE) % (MAX_VALUE * 2 + 1)) - MAX_VALUE;
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 'short int'持有的值溢出,但"自动"不会溢出?
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 大于65535的C++数组[size]引发不一致的溢出
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- C++中无符号字符溢出
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 整数溢出,最大值为 pow(10,19)
- 获取隐式转换溢出从无符号到已签名的警告
- 一种基于最大值包装/溢出数字的算法