CUBRID Engine  latest
bit.c
Go to the documentation of this file.
1 /*
2  * Copyright 2008 Search Solution Corporation
3  * Copyright 2016 CUBRID Corporation
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 /*
20  * bit.c - Bit operations
21  *
22  */
23 
24 #ident "$Id$"
25 
26 #include "bit.h"
27 
28 #include <assert.h>
29 
30 /*
31  * 8-bit section
32  */
33 
34 #define BYTE_ONES_2(n) (n), (n) + 1, (n) + 1, (n) + 2
35 #define BYTE_ONES_4(n) BYTE_ONES_2(n), BYTE_ONES_2((n) + 1), BYTE_ONES_2((n) + 1), BYTE_ONES_2((n) + 2)
36 #define BYTE_ONES_6(n) BYTE_ONES_4(n), BYTE_ONES_4((n) + 1), BYTE_ONES_4((n) + 1), BYTE_ONES_4((n) + 2)
37 #define BYTE_ONES_8(n) BYTE_ONES_6(n), BYTE_ONES_6((n) + 1), BYTE_ONES_6((n) + 1), BYTE_ONES_6((n) + 2)
38 static const int byte_ones[256] = {
39  BYTE_ONES_8 (0)
40 };
41 
42 #define BYTE_ZEROS_2(n) 8 - (n), 8 - (n) - 1, 8 - (n) - 1, 8 - (n) - 2
43 #define BYTE_ZEROS_4(n) BYTE_ZEROS_2(n), BYTE_ZEROS_2((n) + 1), BYTE_ZEROS_2((n) + 1), BYTE_ZEROS_2((n) + 2)
44 #define BYTE_ZEROS_6(n) BYTE_ZEROS_4(n), BYTE_ZEROS_4((n) + 1), BYTE_ZEROS_4((n) + 1), BYTE_ZEROS_4((n) + 2)
45 #define BYTE_ZEROS_8(n) BYTE_ZEROS_6(n), BYTE_ZEROS_6((n) + 1), BYTE_ZEROS_6((n) + 1), BYTE_ZEROS_6((n) + 2)
46 static const int byte_zeros[256] = {
47  BYTE_ZEROS_8 (0)
48 };
49 
50 int
52 {
53  /* use lookup table */
54  return byte_ones[i];
55 }
56 
57 int
59 {
60  /* use lookup table */
61  return byte_zeros[i];
62 }
63 
64 int
66 {
67  /* returns 0 for 1 and 8 for 0 */
68  int c = 7;
69 
70  if (!i)
71  {
72  return 8;
73  }
74 
75  /* leave last trailing 1 */
76  i &= -i;
77 
78  if (i & 0x0F) /* 00001111 */
79  {
80  c -= 4;
81  }
82  if (i & 0x33) /* 00110011 */
83  {
84  c -= 2;
85  }
86  if (i & 0x55) /* 01010101 */
87  {
88  c -= 1;
89  }
90  return c;
91 }
92 
93 int
95 {
96  return bit8_count_trailing_zeros (~i);
97 }
98 
99 int
101 {
102  int c;
103 
104  if (i == 0)
105  {
106  return 8;
107  }
108  c = 7;
109  if (i & 0xF0)
110  {
111  c -= 4;
112  i >>= 4;
113  }
114  if (i & 0x0C)
115  {
116  c -= 2;
117  i >>= 2;
118  }
119  if (i & 0x02)
120  {
121  c -= 1;
122  i >>= 1;
123  }
124  if (i & 0x01)
125  {
126  c -= 1;
127  }
128  return c;
129 }
130 
131 int
133 {
134  return bit8_count_leading_zeros (~i);
135 }
136 
137 bool
138 bit8_is_set (UINT8 i, int off)
139 {
140  assert (off >= 0 && off < 8);
141  return (i & (((UINT8) 1) << off)) != 0;
142 }
143 
144 UINT8
145 bit8_set (UINT8 i, int off)
146 {
147  assert (off >= 0 && off < 8);
148  i |= ((UINT8) 1) << off;
149  return i;
150 }
151 
152 UINT8
153 bit8_clear (UINT8 i, int off)
154 {
155  assert (off >= 0 && off < 8);
156  i &= ~(((UINT8) 1) << off);
157  return i;
158 }
159 
160 UINT8
161 bit8_set_trailing_bits (UINT8 i, int n)
162 {
163  /* do not use it to set all bits */
164  assert (n < 64);
165  return i | ((((UINT8) 1) << n) - 1);
166 }
167 
168 /*
169  * 16-bit section
170  */
171 
172 int
174 {
175  /* use byte lookup table */
176  return byte_ones[i & 0xFF] + byte_ones[i >> 8];
177 }
178 
179 int
181 {
182  /* use byte lookup table */
183  return byte_zeros[i & 0xFF] + byte_zeros[i >> 8];
184 }
185 
186 int
188 {
189  /* returns 0 for 1 and 16 for 0 */
190  int c = 15;
191 
192  if (!i)
193  {
194  return 16;
195  }
196 
197  /* leave last trailing 1 */
198  i &= -i;
199 
200  if (i & 0x00FF) /* 0000000011111111 */
201  {
202  c -= 8;
203  }
204  if (i & 0x0F0F) /* 0000111100001111 */
205  {
206  c -= 4;
207  }
208  if (i & 0x3333) /* 0011001100110011 */
209  {
210  c -= 2;
211  }
212  if (i & 0x5555) /* 0101010101010101 */
213  {
214  c -= 1;
215  }
216  return c;
217 }
218 
219 int
221 {
222  return bit16_count_trailing_zeros (~i);
223 }
224 
225 int
227 {
228  int c;
229 
230  if (i == 0)
231  {
232  return 16;
233  }
234  c = 15;
235  if (i & 0xFF00)
236  {
237  c -= 8;
238  i >>= 8;
239  }
240  if (i & 0x00F0)
241  {
242  c -= 4;
243  i >>= 4;
244  }
245  if (i & 0x000C)
246  {
247  c -= 2;
248  i >>= 2;
249  }
250  if (i & 0x0002)
251  {
252  c -= 1;
253  i >>= 1;
254  }
255  if (i & 0x0001)
256  {
257  c -= 1;
258  }
259  return c;
260 }
261 
262 int
264 {
265  return bit16_count_leading_zeros (~i);
266 }
267 
268 bool
269 bit16_is_set (UINT16 i, int off)
270 {
271  assert (off >= 0 && off < 16);
272  return (i & (((UINT16) 1) << off)) != 0;
273 }
274 
275 UINT16
276 bit16_set (UINT16 i, int off)
277 {
278  assert (off >= 0 && off < 16);
279  i |= ((UINT16) 1) << off;
280  return i;
281 }
282 
283 UINT16
284 bit16_clear (UINT16 i, int off)
285 {
286  assert (off >= 0 && off < 16);
287  i &= ~(((UINT16) 1) << off);
288  return i;
289 }
290 
291 UINT16
292 bit16_set_trailing_bits (UINT16 i, int n)
293 {
294  /* do not use it to set all bits */
295  assert (n < 16);
296  return i | ((((UINT16) 1) << n) - 1);
297 }
298 
299 /*
300  * 32-bit section
301  */
302 
303 int
305 {
306  /* Voodoo SWAR algorithm. One explanation found here: http://www.playingwithpointers.com/swar.html */
307  i = i - ((i >> 1) & 0x55555555);
308  i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
309  return (int) ((((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24);
310 }
311 
312 int
314 {
315  return bit32_count_ones (~i);
316 }
317 
318 int
320 {
321  /* returns 0 for 1 and 32 for 0 */
322  int c = 31;
323 
324  if (!i)
325  {
326  return 32;
327  }
328 
329  /* leave last trailing 1 */
330 #ifdef WINDOWS
331 #pragma warning(disable:4146)
332 #endif
333  i &= -i;
334 #ifdef WINDOWS
335 #pragma warning(default:4146)
336 #endif
337 
338  if (i & 0x0000FFFF) /* 00000000000000001111111111111111 */
339  {
340  c -= 16;
341  }
342  if (i & 0x00FF00FF) /* 00000000111111110000000011111111 */
343  {
344  c -= 8;
345  }
346  if (i & 0x0F0F0F0F) /* 00001111000011110000111100001111 */
347  {
348  c -= 4;
349  }
350  if (i & 0x33333333) /* 00110011001100110011001100110011 */
351  {
352  c -= 2;
353  }
354  if (i & 0x55555555) /* 01010101010101010101010101010101 */
355  {
356  c -= 1;
357  }
358  return c;
359 }
360 
361 int
363 {
364  return bit32_count_trailing_zeros (~i);
365 }
366 
367 int
369 {
370  int c;
371 
372  if (i == 0)
373  {
374  return 32;
375  }
376  c = 31;
377  if (i & 0xFFFF0000)
378  {
379  c -= 16;
380  i >>= 16;
381  }
382  if (i & 0x0000FF00)
383  {
384  c -= 8;
385  i >>= 8;
386  }
387  if (i & 0x000000F0)
388  {
389  c -= 4;
390  i >>= 4;
391  }
392  if (i & 0x0000000C)
393  {
394  c -= 2;
395  i >>= 2;
396  }
397  if (i & 0x00000002)
398  {
399  c -= 1;
400  i >>= 1;
401  }
402  if (i & 0x00000001)
403  {
404  c -= 1;
405  }
406  return c;
407 }
408 
409 int
411 {
412  return bit32_count_leading_zeros (~i);
413 }
414 
415 bool
416 bit32_is_set (UINT32 i, int off)
417 {
418  assert (off >= 0 && off < 32);
419  return (i & (((UINT32) 1) << off)) != 0;
420 }
421 
422 UINT32
423 bit32_set (UINT32 i, int off)
424 {
425  assert (off >= 0 && off < 32);
426  i |= ((UINT32) 1) << off;
427  return i;
428 }
429 
430 UINT32
431 bit32_clear (UINT32 i, int off)
432 {
433  assert (off >= 0 && off < 32);
434  i &= ~(((UINT32) 1) << off);
435  return i;
436 }
437 
438 UINT32
439 bit32_set_trailing_bits (UINT32 i, int n)
440 {
441  /* do not use it to set all bits */
442  assert (n < 32);
443  return i | ((((UINT32) 1) << n) - 1);
444 }
445 
446 /*
447  * 64-bit section
448  */
449 
450 int
452 {
453  /* voodoo SWAR algorithm; one explanation found here: http://www.playingwithpointers.com/swar.html */
454  i = i - ((i >> 1) & 0x5555555555555555);
455  i = (i & 0x3333333333333333) + ((i >> 2) & 0x3333333333333333);
456  return (int) ((((i + (i >> 4)) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56);
457 }
458 
459 int
461 {
462  return bit64_count_ones (~i);
463 }
464 
465 int
467 {
468  /* returns 0 for 1 and 64 for 0 */
469  int c = 63;
470 
471  if (!i)
472  {
473  return 64;
474  }
475 
476  /* leave last trailing 1 */
477 #ifdef WINDOWS
478 #pragma warning(disable:4146)
479 #endif
480  i &= -i;
481 #ifdef WINDOWS
482 #pragma warning(default:4146)
483 #endif
484 
485  if (i & 0x00000000FFFFFFFF) /* 0000000000000000000000000000000011111111111111111111111111111111 */
486  {
487  c -= 32;
488  }
489  if (i & 0x0000FFFF0000FFFF) /* 0000000000000000111111111111111100000000000000001111111111111111 */
490  {
491  c -= 16;
492  }
493  if (i & 0x00FF00FF00FF00FF) /* 0000000011111111000000001111111100000000111111110000000011111111 */
494  {
495  c -= 8;
496  }
497  if (i & 0x0F0F0F0F0F0F0F0F) /* 0000111100001111000011110000111100001111000011110000111100001111 */
498  {
499  c -= 4;
500  }
501  if (i & 0x3333333333333333) /* 0011001100110011001100110011001100110011001100110011001100110011 */
502  {
503  c -= 2;
504  }
505  if (i & 0x5555555555555555) /* 0101010101010101010101010101010101010101010101010101010101010101 */
506  {
507  c -= 1;
508  }
509  return c;
510 }
511 
512 int
514 {
515  return bit64_count_trailing_zeros (~i);
516 }
517 
518 int
520 {
521  int c;
522 
523  if (i == 0)
524  {
525  return 64;
526  }
527  c = 63;
528  if (i & 0xFFFFFFFF00000000)
529  {
530  c -= 32;
531  i >>= 32;
532  }
533  if (i & 0x00000000FFFF0000)
534  {
535  c -= 16;
536  i >>= 16;
537  }
538  if (i & 0x000000000000FF00)
539  {
540  c -= 8;
541  i >>= 8;
542  }
543  if (i & 0x00000000000000F0)
544  {
545  c -= 4;
546  i >>= 4;
547  }
548  if (i & 0x000000000000000C)
549  {
550  c -= 2;
551  i >>= 2;
552  }
553  if (i & 0x0000000000000002)
554  {
555  c -= 1;
556  i >>= 1;
557  }
558  if (i & 0x0000000000000001)
559  {
560  c -= 1;
561  }
562  return c;
563 }
564 
565 int
567 {
568  return bit64_count_leading_zeros (~i);
569 }
570 
571 bool
572 bit64_is_set (UINT64 i, int off)
573 {
574  assert (off >= 0 && off < 64);
575  return (i & (((UINT64) 1) << off)) != 0;
576 }
577 
578 UINT64
579 bit64_set (UINT64 i, int off)
580 {
581  assert (off >= 0 && off < 64);
582  i |= ((UINT64) 1) << off;
583  return i;
584 }
585 
586 UINT64
587 bit64_clear (UINT64 i, int off)
588 {
589  assert (off >= 0 && off < 64);
590  i &= ~(((UINT64) 1) << off);
591  return i;
592 }
593 
594 UINT64
595 bit64_set_trailing_bits (UINT64 i, int n)
596 {
597  /* do not use it to set all bits */
598  assert (n < 64);
599  return i | ((((UINT64) 1) << n) - 1);
600 }
int bit64_count_trailing_zeros(UINT64 i)
Definition: bit.c:466
int bit16_count_leading_zeros(UINT16 i)
Definition: bit.c:226
int bit8_count_trailing_ones(UINT8 i)
Definition: bit.c:94
UINT16 bit16_set_trailing_bits(UINT16 i, int n)
Definition: bit.c:292
int bit16_count_zeros(UINT16 i)
Definition: bit.c:180
int bit64_count_leading_zeros(UINT64 i)
Definition: bit.c:519
int bit64_count_trailing_ones(UINT64 i)
Definition: bit.c:513
int bit8_count_trailing_zeros(UINT8 i)
Definition: bit.c:65
int bit32_count_zeros(UINT32 i)
Definition: bit.c:313
UINT8 bit8_clear(UINT8 i, int off)
Definition: bit.c:153
int bit16_count_trailing_ones(UINT16 i)
Definition: bit.c:220
bool bit8_is_set(UINT8 i, int off)
Definition: bit.c:138
UINT32 bit32_set_trailing_bits(UINT32 i, int n)
Definition: bit.c:439
int bit8_count_leading_ones(UINT8 i)
Definition: bit.c:132
int bit16_count_trailing_zeros(UINT16 i)
Definition: bit.c:187
UINT8 bit8_set_trailing_bits(UINT8 i, int n)
Definition: bit.c:161
int bit8_count_zeros(UINT8 i)
Definition: bit.c:58
UINT32 bit32_set(UINT32 i, int off)
Definition: bit.c:423
UINT16 bit16_set(UINT16 i, int off)
Definition: bit.c:276
#define assert(x)
UINT64 bit64_set_trailing_bits(UINT64 i, int n)
Definition: bit.c:595
int bit32_count_trailing_zeros(UINT32 i)
Definition: bit.c:319
UINT64 bit64_clear(UINT64 i, int off)
Definition: bit.c:587
int bit8_count_leading_zeros(UINT8 i)
Definition: bit.c:100
int bit16_count_leading_ones(UINT16 i)
Definition: bit.c:263
UINT8 bit8_set(UINT8 i, int off)
Definition: bit.c:145
int bit32_count_leading_zeros(UINT32 i)
Definition: bit.c:368
UINT64 bit64_set(UINT64 i, int off)
Definition: bit.c:579
int bit32_count_leading_ones(UINT32 i)
Definition: bit.c:410
bool bit32_is_set(UINT32 i, int off)
Definition: bit.c:416
UINT16 bit16_clear(UINT16 i, int off)
Definition: bit.c:284
int bit16_count_ones(UINT16 i)
Definition: bit.c:173
int bit32_count_ones(UINT32 i)
Definition: bit.c:304
UINT32 bit32_clear(UINT32 i, int off)
Definition: bit.c:431
int bit64_count_zeros(UINT64 i)
Definition: bit.c:460
int bit64_count_leading_ones(UINT64 i)
Definition: bit.c:566
int bit32_count_trailing_ones(UINT32 i)
Definition: bit.c:362
#define BYTE_ZEROS_8(n)
Definition: bit.c:45
int i
Definition: dynamic_load.c:954
#define BYTE_ONES_8(n)
Definition: bit.c:37
int bit64_count_ones(UINT64 i)
Definition: bit.c:451
int bit8_count_ones(UINT8 i)
Definition: bit.c:51
static const int byte_ones[256]
Definition: bit.c:38
bool bit16_is_set(UINT16 i, int off)
Definition: bit.c:269
bool bit64_is_set(UINT64 i, int off)
Definition: bit.c:572
static const int byte_zeros[256]
Definition: bit.c:46