位运算使用的数据类型是整型和字符型
注意单个字符也能进行异或运算 本质也是ASCII二进制码的异或
异或结果的最终解释要看结果变量的类型
不仅整型之间、字符型可以异或 整型和字符串型之间也可以异或
一、原码 反码 补码
正数的原码,反码,补码,移码都等于原码
负数的反码=原码取反 (符号不变)
负数的补码=反码+1
负数的移码=补码的符号位取反
二、位运算原理
对转换成二进制的数字进行每一位上的0、1的运算,:
与(&),或(|),异或(^),左移(<<),右移(>>)
在计算机组成原理中移位运算如下(无符号数左右逻辑移都是补充0)
但是计算机中都是用补码进行运算的 有符号数(算术移位):
正数 不管左移右移都是补0(左移末尾补0 右移高位补和符号位 即0)
负数 左0右1(左移末尾补0 右移高位补和符号位 即1)
按照移动规则括号里面的叙述 那么有符号数不管正数负数的移动规则都是一样的 左移末尾补0 右移高位补和符号位 因此在写代码时并不影响代码的实现
m>>n m 右移n位
m<<n m 左移n位
有符号数移位运算等价于2的幂次乘除法运算
无符号数:左移右移都是补0(逻辑移位)
如在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,若要求将一个无符号数的二进制位反转后输出,输入和输出都将被指定为有符号整数类型,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的,只是最后编译器会根据声明的变量是有股好还是无符号去解释数据为十进制输出给人看,十进制的结果的解释最终是由于编译器去做这件事的,见leetcode例题无符号数的二进制位反转后输出的几种方法
位运算的规律:
1.进行位运算时都是用数据的补码进行运算。
2.运算后得到的结果也是补码,需要将它转换成原码才能得到结果。
其实不光位运算计算机中所有运算都遵循补码运算 结果为负要减1求反这个规则
如果运算后得到的二进制串是一个正数(最高位为0)可以不转因为正数的补码和原码相同;如果为负数 减1再求反
#include <iostream>
void main()
{
//-----------正数按位运算-----------
//按位右移 >> 往右移一位
//0000 0000 0000 1010
//0 0000 0000 0000 101
short sValue1 = 10 >> 1;
printf("sValue1=%d\n", sValue1); //5
//按位左移 << 往左移一位
//0000 0000 0000 1010
//000 0000 0000 1010 0
short sValue2 = 10 << 1;
printf("sValue2=%d\n", sValue2); //20
//按位或 |
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 1111
short sValue3 = 15 | 10;
printf("sValue3=%d\n", sValue3);//15
//按位与 &
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 1010
short sValue4 = 15 & 10;
printf("sValue4=%d\n", sValue4); //10
//按位异或 ^
//0000 0000 0000 1111
//0000 0000 0000 1010
//0000 0000 0000 0101
short sValue5 = 15 ^ 10;
printf("sValue5=%d\n", sValue5);//5
//按位非 ~
//0000 0000 0000 1010
//1111 1111 1111 0101(结果为负数 且是计算机中是补码表示)
//需要补码转原码
//->1111 1111 1111 0100(减1得反码)->1000 0000 0000 1011(求反得原码)
short sValue6 = ~10;
printf("sValue6=%d\n", sValue6);//11
//-----------负数安位运算-----------//
//负数用补码来运算
//按位或 |
//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(补码)
//结果为负的补码 减1求再求反
//->1111 1111 1111 1010(反码)->1000 0000 0000 0101(原码)
short sValue