C++学习笔记(一) 位运算详解
计算机中的符号数有四种表示方法,即原码,反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
原码 反码(存放负数) 补码(用于负数运算) 移码(用于存放负数小数)
正数的原码,反码,补码,移码都是原码
负数的反码=原码取反 (符号不变) 负数的补码=反码+1 负数的移码=补码的符号位取反
位运算
C++位运算有按位左移 << ,按位右移 >> ,按位或 | ,按位与 & ,按位异或 ^ ,按位非 ~ 。
#include <iostream>
void main()
{
//-----------正数安位运算-----------
//按位右移 >> 往右移一位 最高位补上和符号位相同的数
//0000 0000 0000 1010
//0 0000 0000 0000 101
short sValue1 = 10 >> 1;
printf("sValue1=%d\n", sValue1);
//按位左移 << 往左移一位 最末位补0
//0000 0000 0000 1010
//000 0000 0000 1010
short sValue2 = 10 << 1;
printf("sValue2=%d\n", sValue2);
//
//按位或 | 同位或运算 或运算 有1得1 无1得0
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 1111
short sValue3 = 15 | 10;
printf("sValue3=%d\n", sValue3);
//按位与 & 同位与运算 与运算 有0得0 无0得1
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 1010
short sValue4 = 15 & 10;
printf("sValue4=%d\n", sValue4);
//按位异或 ^ 同位异或运算 相同为0 不同为1
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 0101
short sValue5 = 15 ^ 10;
printf("sValue5=%d\n", sValue5);
//按位非 ~
//0000 0000 0000 1010
//1111 1111 1111 0101(补码)->1111 1111 1111 0100(反码)->1000 0000 0000 1011(原码)=11
short sValue6 = ~10;
printf("sValue6=%d\n", sValue6);
//-----------负数安位运算-----------//
//负数用补码来运算
//按位或 | 同位或运算 或运算 有1得1 无1得0
//1000 0000 0000 1111(-15原码)->1111 1111 1111 0000(反码)->1111 1111 1111 0001(补码)
//1111 1111 1111 0001
//0000 0000 0000 1010
//1111 1111 1111 1011(补码)->1111 1111 1111 1010(反码)->1000 0000 0000 0101(原码)=-5
short sValue7 = -15 | 10;
printf("sValue7=%d\n", sValue7);
//按位与 & 同位与运算 与运算 有0得0 无0得1
//1000 0000 0000 1111(-15原码)->1111 1111 1111 0000(反码)->1111 1111 1111 0001(补码)
//1111 1111 1111 0001
//0000 0000 0001 0100
//0000 0000 0001 0000(补码)=16
short sValue8 = -15 & 20;
printf("sValue8=%d\n", sValue8);
//按位异或 ^ 同位异或运算 相同为0 不同为1
//1000 0000 0000 1111(-15原码)->1111 1111 1111 0000(反码)->1111 1111 1111 0001(补码)
//1111 1111 1111 0001
//0000 0000 0001 0100
//1111 1111 1110 0101(补码)->1111 1111 1110 0100(反码)->1000 0000 0001 1011(原码)=-27
short sValue9 = -15 ^ 20;
printf("sValue8=%d\n", sValue9);
//按位非 ~
//1000 0000 0000 1111 (原码)-> 1111 1111 1111 0000 (反码)->1111 1111 1111 0001 (补码)
//1111 1111 1111 0001
//0000 0000 0000 1110 = 14
short sValue10 = ~-15;
printf("sValue10=%d\n", sValue10);
//按位右移 >> 往右移一位 最高位补上和符号位相同的数
//1000 0000 0000 1010 (原码)-> 1111 1111 1111 0101(反码)->1111 1111 1111 0110 (补码)
//1111 1111 1111 0110
//1 1111 1111 1111 011(补码)->1111 1111 1111 1010 (反码)-> 1000 0000 0000 0101 (原码) =-5
short sValue11 = 10 >> 1;
printf("sValue11=%d\n", sValue11);
//按位左移 << 往左移一位 最末位补0
//1000 0000 0000 1010 (原码)-> 1111 1111 1111 0101(反码)->1111 1111 1111 0110 (补码)
//1111 1111 1111 0110
//111 1111 1111 0110 0 (补码)->1111 1111 1110 1011 (反码)-> 1000 0000 0001 0100(原码)=-20
short sValue12 = -10 << 1;
printf("sValue12=%d\n", sValue12);
system("pause");
}
上面运行的结果为:
总结位运算的规律:
1.进行位运算时都是用数据的补码进行运算。
2.运算后得到的结果也是补码,需要将它转换成原码才能得到结果。
本文是C++学习笔记的第一部分,重点介绍了位运算。详细讲解了计算机中符号数的四种表示方法——原码、反码、补码和移码,并明确了正负数在这些表示形式下的变化规则。接着,探讨了C++的位运算符,包括按位左移、按位右移、按位或、按位与、按位异或和按位非。总结了位运算的两大关键规律:使用补码进行运算以及运算结果需转换为原码。
7422

被折叠的 条评论
为什么被折叠?



