左移右移操作_进制转换与区分

main(  ){
  char c=040;
  printf(“%o ",c<<1);
}
左移一位等于乘以2 得到080 因为是八进制,所以进一 0100 输出按照8进制输出,所以输出100;
计算机区分:普通数,十进制,前面加0X的是十六进制,前面加0的,是八进制。
八进制由数字0-7组成表达方式由数字0开头
 
位运算操作符:
1、&:位逻辑与
2、 |:位逻辑或
3、^:位逻辑异或
4、~:位逻辑反
5、>>:右移
6、<<:左移
 
位运算是对字节或字中的实际位进行检测、设置或者移位,它只适用于字符型和整数型变量以及它们的变体,对其他数据类型不适用。
(1)&  逻辑与的运算规则:当进行两个数的逻辑与运算时,先将该两个数化为二进制,然后进行逻辑与运算,当相同位的数只有当双方都为1时,结果才为1,否则为0。
a=5;
b=4;
c=a%b;
c=4;--------------  a=5=0101  b=4=0100  a&b=0100=4
(2) | 逻辑或的运算规则:当进行两个数的逻辑或运算时,先将该两个数化为二进制,然后进行逻辑或运算,当相同位的数只要有一方为1,结果就为1,否则为0。
a=2;b=9;
c=a|b;  a=2=0010; b=9=1001  c=1011=11
(3)逻辑异或的运算规则:当进行两个数的逻辑异或运算时,先将该两个数化为二进制,然后进行逻辑异或运算,当相同位的数只有当双方都为不同数字时,结果才为1,否则为0。
a=6;b=8; c=a^b  ;  a=0110  b=1000; 0110^1000=1110=14;
(4)逻辑反的运算规则:当进行一个数的逻辑反运算时,先将这个数化为二进制,然后进行逻辑反运算,当数为1时,结果为0,当数为0时结果为1。
a=12;b=~a:  12=1100;~1100=0011=3

按照上面的运算规则,我们先将12转换为二进制,为1100,进行位逻辑反运算,则为0011,化为十进制数结果应为3才对啊,那为什么测试的结果是-13呢?
原来啊,在计算机中,二进制的存储方式是以补码的形式存储的。
所以,12在计算机内存储的是01100(第一个0位符号位,代表这个数是正数),对其进行逻辑反运算则为10011,但这个二进制只是b这个变量在计算机内的存储形式(即b的补码形式),所以我们需要将其转换为原码形式,由于符号位为1,为负数,所以我们先对10011转换为反码,即11100,再对其进行+1,所以结果为11101,转换为十进制数则为-13。所以b=-13。

计算机中打印的二进制都是补码的形式

正数原码、反码、补码 三码合一 

负数的原码转换为补码为 符号位不变 数值位按位取反 末位加一

负数,补码的补码等于原码  反码为正 三码合一

(5)右移操作运算规则:左边空出的位用0或者1填补。正数用0填补,负数用1填补。注:不同的环境填补方式可能不同;低位右移溢出则舍弃该位。

a=127,转换为二进制为01111111,由于二进制在计算机内部是以补码的形式进行存储,但由于127是正数,所以其补码为01111111,对该补码进行右移操作运算,按照运算规则,得到00011111,转换为原码,依旧为00011111,转换为十进制数为31,所以,b=31。

对多组数据进行测试,我们可以得到这样一个规律:
当一个数进行n位的右移操作后,所得到的新的数=被操作数/2^n.
(6)左移运算操作规则:右边空出的位用0填补,高位左移溢出则舍弃该高位。

a=-127,转换为二进制为1000 0111 1111,转换为反码为1111 1000 0000,转换为补码是1111 1000 0001,对其进行左移三位的操作,得到:1100 0000 1000,将其转换为反码:1100 0000 0111,再将其转换为原码:1011 1111 1000,转换为十进制数,为-1016,所以b=-1016。
对多组数据进行测试,我们可以得到这样一个规律:
当一个数进行n位的左移操作后,所得到的新的数=被操作数*2^n.

原文地址:https://www.cnblogs.com/samanian/p/11391894.html