C++学习笔记(一) 位运算详解

来源:互联网 发布:mac app store中文版 编辑:程序博客网 时间:2024/04/29 14:03

  C++学习笔记(一)   位运算详解

  计算机中的符号数有四种表示方法,即原码,反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同


         原码    反码(存放负数)   补码(用于负数运算)   移码(用于存放负数小数)


   正数的原码,反码,补码,移码都是原码

   负数的反码=原码取反  (符号不变)  负数的补码=反码+1  负数的移码=补码的符号位取反


   位运算

  C++位运算有按位左移 << ,按位右移 >> ,按位或 | ,按位与 & ,按位异或 ^ ,按位非 ~ 。

#include <iostream>void main(){//-----------正数安位运算-----------//按位右移  >> 往右移一位  最高位补上和符号位相同的数//0000 0000 0000 1010//0 0000 0000 0000 101short sValue1 = 10 >> 1;printf("sValue1=%d\n", sValue1);//按位左移  << 往左移一位  最末位补0//0000 0000 0000 1010//000 0000 0000 1010short sValue2 = 10 << 1;printf("sValue2=%d\n", sValue2);////按位或  |  同位或运算   或运算 有1得1 无1得0//0000 0000 0000 1111//0000 0000 0000 1010//0000 0000 0000 1111short sValue3 = 15 | 10;printf("sValue3=%d\n", sValue3);//按位与 &   同位与运算   与运算 有0得0 无0得1//0000 0000 0000 1111//0000 0000 0000 1010//0000 0000 0000 1010short sValue4 = 15 & 10;printf("sValue4=%d\n", sValue4);//按位异或  ^ 同位异或运算   相同为0  不同为1//0000 0000 0000 1111//0000 0000 0000 1010//0000 0000 0000 0101short sValue5 = 15 ^ 10;printf("sValue5=%d\n", sValue5);//按位非 ~  //0000 0000 0000 1010          //1111 1111 1111 0101(补码)->1111 1111 1111 0100(反码)->1000 0000 0000 1011(原码)=11short 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(原码)=-5short 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(补码)=16short 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(原码)=-27short 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  = 14short 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 (原码) =-5short 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(原码)=-20short sValue12 = -10 << 1;printf("sValue12=%d\n", sValue12);system("pause");}  

  上面运行的结果为:





 总结位运算的规律:

  1.进行位运算时都是用数据的补码进行运算。

  2.运算后得到的结果也是补码,需要将它转换成原码才能得到结果。

0 0
原创粉丝点击