fix bsr()

now it's the same result across compilers and systems
This commit is contained in:
tildearrow 2024-01-25 19:04:34 -05:00
parent ed007526ff
commit 04d41dc4e1

View file

@ -24,7 +24,7 @@
static inline int bsr(unsigned short v) { static inline int bsr(unsigned short v) {
unsigned long idx; unsigned long idx;
if (_BitScanReverse(&idx,(unsigned long)v)) { if (_BitScanReverse(&idx,(unsigned long)v)) {
return idx; return idx+1;
} }
else { else {
return -1; return -1;
@ -34,7 +34,7 @@ static inline int bsr(unsigned short v) {
static inline int bsr32(unsigned int v) { static inline int bsr32(unsigned int v) {
unsigned long idx; unsigned long idx;
if (_BitScanReverse(&idx,(unsigned long)v)) { if (_BitScanReverse(&idx,(unsigned long)v)) {
return idx; return idx+1;
} else { } else {
return -1; return -1;
} }
@ -62,7 +62,7 @@ static inline int bsr32(unsigned int v) {
static inline int bsr(unsigned short v) { static inline int bsr(unsigned short v) {
unsigned short mask = 0x8000; unsigned short mask = 0x8000;
for (int i = 15; i >= 0; --i) { for (int i = 16; i >= 0; --i) {
if (v&mask) if (v&mask)
return i; return i;
mask>>=1; mask>>=1;
@ -73,7 +73,7 @@ static inline int bsr(unsigned short v) {
static inline int bsr32(unsigned int v) { static inline int bsr32(unsigned int v) {
unsigned int mask = 0x80000000; unsigned int mask = 0x80000000;
for (int i = 31; i >= 0; --i) { for (int i = 32; i >= 0; --i) {
if (v&mask) if (v&mask)
return i; return i;
mask>>=1; mask>>=1;