builtin-bitops-1.c
来自「用于进行gcc测试」· C语言 代码 · 共 264 行
C
264 行
#include <limits.h>#include <assert.h>#if __INT_MAX__ > 2147483647L# if __INT_MAX__ >= 9223372036854775807L# define BITSIZEOF_INT 64# else# define BITSIZEOF_INT 32# endif#else# if __INT_MAX__ >= 2147483647L# define BITSIZEOF_INT 32# else# define BITSIZEOF_INT 16# endif#endif#if __LONG_MAX__ > 2147483647L# if __LONG_MAX__ >= 9223372036854775807L# define BITSIZEOF_LONG 64# else# define BITSIZEOF_LONG 32# endif#else# define BITSIZEOF_LONG 32#endif#if __LONG_LONG_MAX__ > 2147483647L# if __LONG_LONG_MAX__ >= 9223372036854775807L# define BITSIZEOF_LONG_LONG 64# else# define BITSIZEOF_LONG_LONG 32# endif#else# define BITSIZEOF_LONG_LONG 32#endif#define MAKE_FUNS(suffix, type) \int my_ffs##suffix(type x) { \ int i; \ if (x == 0) \ return 0; \ for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ if (x & ((type) 1 << i)) \ break; \ return i + 1; \} \ \int my_ctz##suffix(type x) { \ int i; \ for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ if (x & ((type) 1 << i)) \ break; \ return i; \} \ \int my_clz##suffix(type x) { \ int i; \ for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ if (x & ((type) 1 << ((CHAR_BIT * sizeof (type)) - i - 1))) \ break; \ return i; \} \ \int my_popcount##suffix(type x) { \ int i; \ int count = 0; \ for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ if (x & ((type) 1 << i)) \ count++; \ return count; \} \ \int my_parity##suffix(type x) { \ int i; \ int count = 0; \ for (i = 0; i < CHAR_BIT * sizeof (type); i++) \ if (x & ((type) 1 << i)) \ count++; \ return count & 1; \}MAKE_FUNS (, unsigned);MAKE_FUNS (l, unsigned long);MAKE_FUNS (ll, unsigned long long);extern void abort (void);extern void exit (int);#define NUMS16 \ { \ 0x0000U, \ 0x0001U, \ 0x8000U, \ 0x0002U, \ 0x4000U, \ 0x0100U, \ 0x0080U, \ 0xa5a5U, \ 0x5a5aU, \ 0xcafeU, \ 0xffffU \ }#define NUMS32 \ { \ 0x00000000UL, \ 0x00000001UL, \ 0x80000000UL, \ 0x00000002UL, \ 0x40000000UL, \ 0x00010000UL, \ 0x00008000UL, \ 0xa5a5a5a5UL, \ 0x5a5a5a5aUL, \ 0xcafe0000UL, \ 0x00cafe00UL, \ 0x0000cafeUL, \ 0xffffffffUL \ }#define NUMS64 \ { \ 0x0000000000000000ULL, \ 0x0000000000000001ULL, \ 0x8000000000000000ULL, \ 0x0000000000000002ULL, \ 0x4000000000000000ULL, \ 0x0000000100000000ULL, \ 0x0000000080000000ULL, \ 0xa5a5a5a5a5a5a5a5ULL, \ 0x5a5a5a5a5a5a5a5aULL, \ 0xcafecafe00000000ULL, \ 0x0000cafecafe0000ULL, \ 0x00000000cafecafeULL, \ 0xffffffffffffffffULL \ }unsigned int ints[] =#if BITSIZEOF_INT == 64NUMS64;#elif BITSIZEOF_INT == 32NUMS32;#elseNUMS16;#endifunsigned long longs[] =#if BITSIZEOF_LONG == 64NUMS64;#elseNUMS32;#endifunsigned long long longlongs[] =#if BITSIZEOF_LONG_LONG == 64NUMS64;#elseNUMS32;#endif#define N(table) (sizeof (table) / sizeof (table[0]))intmain (void){ int i; for (i = 0; i < N(ints); i++) { if (__builtin_ffs (ints[i]) != my_ffs (ints[i])) abort (); if (ints[i] != 0 && __builtin_clz (ints[i]) != my_clz (ints[i])) abort (); if (ints[i] != 0 && __builtin_ctz (ints[i]) != my_ctz (ints[i])) abort (); if (__builtin_popcount (ints[i]) != my_popcount (ints[i])) abort (); if (__builtin_parity (ints[i]) != my_parity (ints[i])) abort (); } for (i = 0; i < N(longs); i++) { if (__builtin_ffsl (longs[i]) != my_ffsl (longs[i])) abort (); if (longs[i] != 0 && __builtin_clzl (longs[i]) != my_clzl (longs[i])) abort (); if (longs[i] != 0 && __builtin_ctzl (longs[i]) != my_ctzl (longs[i])) abort (); if (__builtin_popcountl (longs[i]) != my_popcountl (longs[i])) abort (); if (__builtin_parityl (longs[i]) != my_parityl (longs[i])) abort (); } for (i = 0; i < N(longlongs); i++) { if (__builtin_ffsll (longlongs[i]) != my_ffsll (longlongs[i])) abort (); if (longlongs[i] != 0 && __builtin_clzll (longlongs[i]) != my_clzll (longlongs[i])) abort (); if (longlongs[i] != 0 && __builtin_ctzll (longlongs[i]) != my_ctzll (longlongs[i])) abort (); if (__builtin_popcountll (longlongs[i]) != my_popcountll (longlongs[i])) abort (); if (__builtin_parityll (longlongs[i]) != my_parityll (longlongs[i])) abort (); } /* Test constant folding. */#define TEST(x, suffix) \ if (__builtin_ffs##suffix (x) != my_ffs##suffix (x)) \ abort (); \ if (x != 0 && __builtin_clz##suffix (x) != my_clz##suffix (x)) \ abort (); \ if (x != 0 && __builtin_ctz##suffix (x) != my_ctz##suffix (x)) \ abort (); \ if (__builtin_popcount##suffix (x) != my_popcount##suffix (x)) \ abort (); \ if (__builtin_parity##suffix (x) != my_parity##suffix (x)) \ abort ();#if BITSIZEOF_INT == 32 TEST(0x00000000UL,); TEST(0x00000001UL,); TEST(0x80000000UL,); TEST(0x40000000UL,); TEST(0x00010000UL,); TEST(0x00008000UL,); TEST(0xa5a5a5a5UL,); TEST(0x5a5a5a5aUL,); TEST(0xcafe0000UL,); TEST(0x00cafe00UL,); TEST(0x0000cafeUL,); TEST(0xffffffffUL,);#endif#if BITSIZEOF_LONG_LONG == 64 TEST(0x0000000000000000ULL, ll); TEST(0x0000000000000001ULL, ll); TEST(0x8000000000000000ULL, ll); TEST(0x0000000000000002ULL, ll); TEST(0x4000000000000000ULL, ll); TEST(0x0000000100000000ULL, ll); TEST(0x0000000080000000ULL, ll); TEST(0xa5a5a5a5a5a5a5a5ULL, ll); TEST(0x5a5a5a5a5a5a5a5aULL, ll); TEST(0xcafecafe00000000ULL, ll); TEST(0x0000cafecafe0000ULL, ll); TEST(0x00000000cafecafeULL, ll); TEST(0xffffffffffffffffULL, ll);#endif exit (0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?