AMXX-BG.INFO bit.inc Raw include

bit.inc

Original include source with line numbers.

Back Download .inc
1 /*
2 Bit functions
3
4 by Lulu the hero
5 ([email protected])
6
7 https://forums.alliedmods.net/showthread.php?t=144645
8
9 Last update(dd.mm.yyyy): 03.03.2011.
10
11 These set of stocks/defines ease up bit manipulations.
12
13 This file is provided as is (no warranties).
14 */
15
16 #if defined _bit_included
17 #endinput
18 #endif
19
20 #define _bit_included
21
22 #if cellbits == 32
23 #define cellnibbles 8
24 #define player_to_flag(%1) (1 << (%1 & 31))
25 #else
26 #define cellnibbles 16
27 #define player_to_flag(%1) (1 << %1)
28 #endif
29
30 #define bit_to_flag(%1) (1 << %1)
31
32 #define COUNT_BIT 1
33 #define COUNT_NIBBLE 4
34
35 new const HEXCHARS[] = "0123456789ABCDEF";
36
37 /* ----- in the functions below %1 is the integer, %2 is the player's id/bitnumber ----- */
38
39 // Negate a bit - with XOR
40 #define toggle_player_flag(%1,%2) (%1 = %1 ^ player_to_flag(%2))
41 #define toggle_flag(%1,%2) (%1 = %1 ^ bit_to_flag(%2))
42
43 // Clear a bit - set it to 0 with NAND
44 #define clear_player_flag(%1,%2) (%1 = %1 & ~player_to_flag(%2))
45 #define clear_flag(%1,%2) (%1 = %1 & ~bit_to_flag(%2))
46
47 // Set a bit - set is to 1 with OR
48 #define set_player_flag(%1,%2) (%1 = %1 | player_to_flag(%2))
49 #define set_flag(%1,%2) (%1 = %1 | bit_to_flag(%2))
50
51 // Returns a bit's value - with AND
52 #define is_player_flag_set(%1,%2) (%1 & player_to_flag(%2))
53 #define is_flag_set(%1,%2) (%1 & bit_to_flag(%2))
54
55 // Converts the integer to a binary number string
56 // ( max string length is cellbits )
57 stock num_to_binstr(num, dest[], zero_fill = 0)
58 {
59 dest[0] = 0;
60 new len = (zero_fill ? cellbits : get_highest(num, COUNT_BIT));
61 for(new i = 0; i < len; i++)
62 {
63 dest[len - i] = ((num >> i) & 1) + '0';
64 }
65 len++;
66 dest[len] = 0;
67 return len;
68 }
69
70 // Converts the integer to a hexadecimal number string
71 // ( max string length is cellnibbles )
72 stock num_to_hexstr(num, dest[], zero_fill = 0)
73 {
74 dest[0] = 0;
75 new len = (zero_fill ? cellnibbles : get_highest(num, COUNT_NIBBLE));
76 for(new i = 0; i < len; i++)
77 {
78 dest[len - i] = HEXCHARS[((num >> (i << 2)) & 15)];
79 }
80 len++;
81 dest[len] = 0;
82 return len;
83 }
84
85 // Rotates an integer's bits to left
86 stock rol(integer, step = 1)
87 {
88 if(step >= cellbits)
89 {
90 step = step % cellbits;
91 }
92 if(!step)
93 {
94 return integer;
95 }
96 new overflow = integer;
97 integer <<= step;
98 overflow >>= (cellbits - step);
99 return integer | overflow;
100 }
101
102 // Rotates an integer's bits to right
103 stock ror(integer, step = 1)
104 {
105 if(step >= cellbits)
106 {
107 step = step % cellbits;
108 }
109 if(!step)
110 {
111 return integer;
112 }
113 new overflow = integer;
114 integer >>= step;
115 overflow <<= (cellbits - step)
116 return integer | overflow;
117 }
118
119 // Gets the highest bit/nibble
120 stock get_highest(integer, count_type = COUNT_BIT)
121 {
122 new num = 0;
123 if(integer) num++;
124 while (integer >>= count_type)
125 {
126 num++;
127 }
128 return num;
129 }
130
131 // Counts the 1 bits in a number
132 stock count_bits(integer)
133 {
134 new cnt;
135 for(cnt = 0; integer; cnt++)
136 {
137 integer &= integer - 1;
138 }
139 return cnt;
140 }
141 /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
142 *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1038\\ f0\\ fs16 \n\\ par }
143 */
144