Tag: 按位运算符

有没有办法在没有模数/除法运算符的情况下编写“mod 31”?

如果操作数是2的幂,则可以在没有模数运算符或除法的情况下容易地获得数字的模数。在这种情况下,下面的公式成立: x % y = (x & (y − 1)) 。 在许多架构中,这通常很有效。 mod 31也可以这样做吗? int mod31(int a){ return a % 31; };

C问题:off_t(和其他有符号整数类型)的最小值和最大值

我偶尔会遇到一个整数类型(例如POSIX有符号整数类型off_t ),其中有一个宏的最小值和最大值是有帮助的,但我不知道如何制作一个真正可移植的宏。 对于无符号整数类型,我一直认为这很简单。 0表示最小值, ~0表示最大值。 我已经阅读了几个不同的SO线程,建议使用-1而不是-1来实现可移植性。 这里有一个有争议的有趣线程: c ++ – 使用-1将所有位设置为true是否安全? – 堆栈溢出 然而,即使在阅读了这个问题后,我仍然感到困惑。 另外,我正在寻找兼容C89和C99的东西,所以我不知道是否适用相同的方法。 说我有一种uint_whatever_t 。 难道我不能先转为0然后按位补码? 这样可以吗? #define UINT_WHATEVER_T_MAX ( ~ (uint_whatever_t) 0 ) 有符号的整数类型看起来像是一个更难以破解的坚果。 我已经看到了几种不同的可能解决方案,但只有一种似乎是可移植的。 无论是那个还是不正确的。 我在谷歌搜索OFF_T_MAX和OFF_T_MIN时找到了它。 感谢Christian Biere: #define MAX_INT_VAL_STEP(t) \ ((t) 1 << (CHAR_BIT * sizeof(t) – 1 – ((t) -1 < 1))) #define MAX_INT_VAL(t) \ ((MAX_INT_VAL_STEP(t) – 1) + […]