目录
-
一、原、反、补码
有符号整数的三种表示方法均有符号位和数值位两部分,2进制序列中,最高位的1位为符号位,后面的都是数值位。
符号位:“0”代表此数为正,“1”代表而此数为负。
原码:直接将数值按照正负数的形式翻译成二进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
-
二、移位操作符
1.左移操作符
移位规则:左边抛弃、右边补0。
2.右移操作符
逻辑右移:左边用0填充,右边丢弃。
算术右移:左边用原该值的符号位填充,右边丢弃。
-
三、位操作符
1.“&”按位与
“&”按位与就是将两数的二进制位的每一位两两进行与运算,即为两位同为1,则为1,否则为0(同真为真,否则为假),最终算出结果。
2.“|”按位或
“|”按位或就是将两数的二进制位的每一位两两进行或运算,即为两位只要有一位为1,则为1,否则为0(同假则假,否则为真),最终算出结果。
3.“^”按位异或
“^”按位异或就是将两数的二进制位的每一位两两进行异或运算,即为两位相异为1,相同为0,最终算出结果。
4.“~”按位取反
“~”按位取反是单目操作符(与上述操作符不同),就是将一个数的二进制位的每位取反,即为1为0,0为1,最终算出结果。
-
四、位操作符的例题
1.交换两个变量(不创建临时变量)
int main()
{
int a = 2, b = 8;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d", a, b);
return 0;
}
2.统计二进制中1的个数
int main()
{
int n = 0,i = 0,count = 0;
scanf("%d", &n);
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
printf("%d", count);
return 0;
}
3.求两个数二进制中不同位的个数
int main()
{
int a = 0, b = 0,i=0,count=0;
scanf("%d %d", &a, &b);
int n = a ^ b;
for (i = 0; i < 32; i++)
{
if (((n >> i) & 1) == 1)
{
count++;
}
}
printf("%d", count);
return 0;
}