moved code to count bits to separate function
authorHolger Schemel <info@artsoft.org>
Wed, 17 May 2023 10:29:18 +0000 (12:29 +0200)
committerHolger Schemel <info@artsoft.org>
Wed, 17 May 2023 10:29:18 +0000 (12:29 +0200)
src/editor.c
src/libgame/misc.c
src/libgame/misc.h

index d4e2bc8e8015cde39b646a1587ed700c69fd5639..25edbb4b764a0735aacb4fa98ffa4c97d9b361e1 100644 (file)
@@ -12054,19 +12054,10 @@ static boolean isHiresDrawElement(int element)
 
 static int numHiresTiles(int element)
 {
-  if (!IS_MM_WALL(element))
-    return 1;
-
-  int bits = MM_WALL_BITS(element);
-  int num_bits = 0;
-
-  while (bits)
-  {
-    bits &= bits - 1;
-    num_bits++;
-  }
+  if (IS_MM_WALL(element))
+    return get_number_of_bits(MM_WALL_BITS(element));
 
-  return num_bits;
+  return 1;
 }
 
 static void SetDrawModeHiRes(int element)
index a76bba5653a55990f0504cffedd738ed262ef320..02358aa292a3803890ca42b4526f679af0884cce 100644 (file)
@@ -1682,6 +1682,31 @@ void swap_number_pairs(int *x1, int *y1, int *x2, int *y2)
   *y2 = help_y;
 }
 
+int get_number_of_bits(int bits)
+{
+  /*
+    Counting bits set, Brian Kernighan's way
+
+    Brian Kernighan's method goes through as many iterations as there are set
+    bits. So if we have a 32-bit word with only the high bit set, then it will
+    only go once through the loop.
+
+    Published in 1988, the C Programming Language 2nd Ed. (by Brian W. Kernighan
+    and Dennis M. Ritchie) mentions this in exercise 2-9.
+    First published by Peter Wegner in CACM 3 (1960), 322.
+  */
+
+  int num_bits = 0;
+
+  while (bits)
+  {
+    bits &= bits - 1;  // clear the least significant bit set
+    num_bits++;
+  }
+
+  return num_bits;
+}
+
 /* the "put" variants of the following file access functions check for the file
    pointer being != NULL and return the number of bytes they have or would have
    written; this allows for chunk writing functions to first determine the size
index c8e00c843cce5a59ff03f46edbecb659f8c70d19..7097e9685dddfc6e5a8b3d967c5db41b0448310f 100644 (file)
@@ -203,6 +203,7 @@ void clear_mem(void *, unsigned int);
 
 void swap_numbers(int *, int *);
 void swap_number_pairs(int *, int *, int *, int *);
+int get_number_of_bits(int);
 
 int getFile8BitInteger(File *);
 int putFile8BitInteger(FILE *, int);