(x & ~x) is always 0.
((x & (~x + 1)) != x) works.
((x & (x - 1)) != 0) works too.
ext/standard/random.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ext/standard/random.c b/ext/standard/random.c
index 12c2503..4a1adbf 100644
--- a/ext/standard/random.c
+++ b/ext/standard/random.c
@@ -182,7 +182,7 @@ PHP_FUNCTION(random_int)
umax++;
/* Powers of two are not biased */
- if ((umax & ~umax) != umax) {
- if ((umax & (umax - 1)) != 0) {
/* Ceiling under which ZEND_LONG_MAX % max == 0 */
zend_ulong limit = ZEND_ULONG_MAX - (ZEND_ULONG_MAX % umax) - 1;
--
2.4.0
On Sun, May 10, 2015 at 12:40 PM, Lauri Kenttä lauri.kentta@gmail.com
wrote:
(x & ~x) is always 0.
((x & (~x + 1)) != x) works.
((x & (x - 1)) != 0) works too.ext/standard/random.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)diff --git a/ext/standard/random.c b/ext/standard/random.c
index 12c2503..4a1adbf 100644
--- a/ext/standard/random.c
+++ b/ext/standard/random.c
@@ -182,7 +182,7 @@ PHP_FUNCTION(random_int)
umax++;/* Powers of two are not biased */
if ((umax & ~umax) != umax) {
if ((umax & (umax - 1)) != 0) { /* Ceiling under which ZEND_LONG_MAX % max == 0 */ zend_ulong limit = ZEND_ULONG_MAX - (ZEND_ULONG_MAX %
umax) - 1;
--
2.4.0
Good catch, thanks! Applied via
https://github.com/php/php-src/commit/cf7e5357a46afe1dca978f4887bbd83a7507ce69
.
Nikita