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
- C++学习笔记(一) 位运算详解
- 位运算学习(一)
- C语言学习笔记系列(2)位运算
- C语言学习笔记11--位运算
- C语言学习笔记 位运算
- c 位运算详解
- 位运算符(一):C/C++位运算符
- 位运算符(一):C/C++位运算符
- 位运算学习笔记
- 学习笔记---位运算
- 位运算学习笔记
- C语言位运算详解(基础)
- c语言学习笔记(8)位运算符,++,--运算符的用法
- C学习笔记(一) 数据、运算符、表达式
- Java学习笔记(位运算符)
- 学习位运算(操作)的笔记
- java学习笔记(一)----位运算符与逻辑运算符
- C语言位运算详解
- SpringMvc的ajax
- springMVC相关知识点
- Hibernate简单配置及应用案例
- Jquery获取被选中的text值
- 【MongoDB】批量导入CSV文件
- C++学习笔记(一) 位运算详解
- slam学习
- 父类子类初始化过程的讨论
- JVM垃圾回收算法
- JavaScript 获取输入时的光标位置及场景问题
- java中的regex
- 文章标题
- servlet的request详解
- WebService为什么不如RESTful API流行