引用从http://graphics.stanford.edu/~seander/bithacks.html开始无分支计算整数绝对值(Abs)的代码:

int v;           // we want to find the absolute value of v
unsigned int r;  // the result goes here 
int const mask = v >> sizeof(int) * CHAR_BIT - 1;

r = (v + mask) ^ mask;

专利变体:

r = (v ^ mask) - mask;

什么是CHAR_BIT,如何使用它?

推荐答案

您应该知道,这段代码取决于右位移位在签名类型上的实现定义的行为.gccpromise 总是给出sane行为(符号位扩展),但ISO C允许实现零填充高位.

解决这个问题的一个方法是:

#ifdef HAVE_SIGN_EXTENDING_BITSHIFT
int const mask = v >> sizeof(int) * CHAR_BIT - 1;
#else
int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1);
#endif

根据您的平台,您的Makefileconfig.h等可以在构建时定义HAVE_SIGN_EXTENDING_BITSHIFT.

C++相关问答推荐

C sscanf没有捕获第二个参数

我应该如何解决我自己为iOS编译的xmlsec1库的问题?转换Ctx.first在xmlSecTransformCtxPrepare()之后为空

创建一个fork导致fget无限地重新读取文件

为什么C语言允许你使用var =(struct NAME){

使用双指针动态分配和初始化2D数组

C在声明带有值的数组时,声明大小有用吗?

struct -未知大小

GCC不顾-fno-Builtin-SINCOS旗帜向SINCOS发出呼唤

从C文件中删除注释

我在反转双向链表时遇到问题

为什么Linux无法映射这个PT_LOAD ELF段?

可以';t从A9G模块拨打电话

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

将不同类型的指针传递给函数(C)

即使客户端不发送数据,也会发生UNIX套接字读取

与指针的原始C数组或C++向量<;向量<;双>>;

C 错误:对 int 数组使用 typedef 时出现不兼容的指针类型问题

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

将数组返回到链表

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?