{
#if defined(__GNUC__)
return __builtin_ctzl(~bitset);
+#elif defined(_WIN32)
+ unsigned long index;
+
+#if defined(_WIN64)
+ if (!BitScanForward64(&index, ~bitset)) {
+#else
+ if (!BitScanForward(&index, ~bitset)) {
+#endif
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (int)index;
#else
int n;
{
#if defined(__GNUC__)
return __builtin_ctzl(bitset);
+#elif defined(_WIN32)
+ unsigned long index;
+
+#if defined(_WIN64)
+ if (!BitScanForward64(&index, bitset)) {
+#else
+ if (!BitScanForward(&index, bitset)) {
+#endif
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (int)index;
#else
int n;
{
#if defined(__GNUC__)
return (__builtin_clz(size) ^ 0x1f) + 1;
+#elif defined(_WIN32)
+ unsigned long index;
+
+ if (!BitScanReverse(&index, (unsigned long)size)) {
+ /* undefined behavior */
+ return 32;
+ }
+
+ return (((31 - (int)index) ^ 0x1f) + 1);
#else
int n = 16;
if (size <= 0x00ff) {n -= 8; size = size << 8;}