【发布时间】:2023-01-12 04:46:53
【问题描述】:
我偶然发现了这行简单的代码,但我无法弄清楚它的作用。我理解它在不同部分的作用,但我并不真正理解它的整体。
// We have an integer(32 bit signed) called i
// The following code snippet is inside a for loop declaration
// in place of a simple incrementor like i++
// for(;;HERE){}
i += (i&(-i))
如果我理解正确的话,它在 i 和负 i 之间使用 AND 二元运算符,然后将该数字添加到 i。我首先认为这将是一种计算整数绝对值的优化方法,但是据我所知,c++ 不会简单地通过翻转一点来存储负整数,但如果我错了请纠正我。
【问题讨论】:
-
这是您自己探索的好机会。编写一个程序,循环打印出
i和(i&(-i))以查看值是什么。找出值的二进制表示(手动或使用程序)以找到模式 -
c ++不会简单地通过翻转位来存储负整数. AFAIK C23 要求对负整数值使用二进制补码。
-
您需要指定您要求的语言(您同时标记了 C 和 C++)和版本。关于整数表示的规则在不同语言或版本之间不一定相同。
-
您询问绝对值:使用二进制补码整数,它可以实现为
(x + (x >> N)) ^ (x >> N),其中N是位 -1 中类型的大小。 -
如果
i是INT_MIN,此代码将调用 UB
标签: c++ c integer bit bitwise-and