~:各位取反运算
首先需要明确的一点:计算机存储的是二进制,是补码。~(取反运算)针对的便是补码,而且是对全部的二进制位进行取反,不论是否为符号位。
5 的补码:整数的补码,仍然为其自身,0000 0101,
~5
(1)各位取反,1111 1111 1111 1010
(2)将其转换为源码,即-1,再取反(符号位除外),1000 0000 0000 0110 ⇒ -6-5 的补码,
1000 0000 0000 0101 ⇒ 1111 1111 1111 1010(各位取反) ⇒ 1111 1111 1111 1011(再加1)
~(-5):
(1)对其补码取反(全部位),⇒ 0000 0000 0000 0100 ⇒ 4
获取一个数的符号位
x >> 31 & 0x01;
// x 为 int(32位机)型整数
不使用”-“号,实现取负
~x+1;
// 无论正负
实现 abs(求绝对值)
x >> 31 & 0x01 ? ~x+1 : x ;
// 正数的绝对值是其自身
// 负数的绝对值是其反
判断二进制位形式中1的个数
int numOf1(int x)
{
int cnt = 0;
while (x)
{
++cnt;
x &= (x-1);
}
return cnt;
}
二进制形式中最右为1所在的位置
比如 1100 ⇒ 4, 1110 ⇒ 2,1000 ⇒ 8
(x ^ (x-1)) & x
实现对一个数二进制形式的截断
实现对一个数二进制形式的截断,使其为 2^n 的倍数;
uchar mask = 0xff << n;
x &= mask;