不是STL但是和STL一样神奇:位运算

这个东西可以输出\(2^{64}\)\(2^{64}-n\),因为long long<\(2^{63}而且\)ull <\(2^{64}\),所以不能直接算出然后减,只要把unsigned long long 定义的n变成负数就可以了。我要不要记住?还是研究一下?

	if(ans==64&&!n)puts("18446744073709551616");
	else cout<<(ans==64?-n:(1ull<<ans)-n)<<endl;

是因为计算机存储负数的特殊性,存储正数:反码原码补码都是一样的,负数需要特殊的操作。

在这里n本来是ull,取负数相当于是在补码(就是n正常的二进制位)基础上取反(包括第63位)再+1,然后你发现这个结果刚好是\(2^{64}-n\),因为本来的符号位变成了1,和原来的n+那么本来表示不出来的\(2^{64}\)就是运算的结果。

posted on 2022-09-28 17:58  HZOI-曹蓉  阅读(19)  评论(0编辑  收藏  举报