bitset


位运算函数

: __builtin_popcount
__builtin_popcount(x) ; // 返回 x 二进制下 1 的个数 , 要求 x 为无符号整型 (unsigned int)
__builtin_popcountll(x) ; // unsigned long long

:__builtin_parity(x) ; // x 二进制下 1 的奇偶性
//__builtin_parityll(x) ;

:__builtin_ctz(x) ; // x 二进制下末尾 0 的个数

:__builtin_clz(x) ; // x 二进制下开头 0 的个数 (32位)
//__builtin_clz(0) = 31 , log2(x) = 31 - __builtin_clz(x)

bitset

bitset<1280> a;

: a.any() // a 中是否存在 1
	cout << (int)a.any() << '\n'; // 0
	a[1] = 1 , a[2] = 1;
	cout << (int)a.any() << '\n'; // 1
	a[1] = 0 , a[2] = 0;
	cout << (int)a.any() << '\n'; // 0
	
:a.none() // a 中是否全是 0

:a.count() // a 中有几个 1

:a.set(x) // 将 x 位变成 1

:a.set() // 将所有位全部变成 1

:a.reset(x) , a.reset() // 将 x 位 / 所有位变成 0

:a.flip(x) , a.flip() // 将 x 位反转(0 -> 1 , 1 -> 0) , / 所有位

:_Find_first , Find_next //寻找第一个 1 位置 , 寻找下一个 1 位置
	a[7] = 1 , a[6] = 1 , a[3] = 1 , a[2] = 1 , a[0] = 1;
	for(int i = a._Find_first() ; i != a.size() ; i = a._Find_next(i))
		cout << i << ' '; // 0 2 3 6 7
		
:	auto pa = (ull*)&a; // 将 a 以每 64 位分割 , 取其地址
	a[0] = 1 , a[80] = 1;
	cout << pa[0] << ' ' << pa[1] << '\n'; // 1 65536


posted @ 2023-05-22 14:20  xqy2003  阅读(23)  评论(0)    收藏  举报