二进制:0b或者0B开头 八进制:0开头 十进制:直接写 十六进制:0x或0X开头
进制转换
10进制:123=1*100+2*10+3*1=123
8进制:0123=1*64+2*8+3*1=83
16进制:0x123=1*256+2*16+3*1=291
二进制与八进制互转:
每3个2进制表示一个8进制:因为0b111==07 (8进制每位最大是7)
2进制转8进制:0b 011 111 111=0377
8进制转2进制:0 1 2 3=001 010 011
二进制与十六进制互转:
0b 0011 1111 1111=0x3FF
0x 1 2 3=0001 0010 0011
123-->2进制:0b0111 1011-->8进制:0173-->16进制:0x7B
位运算
&与运算:对应两个二进位均为1时,结果位才为1,否则为0。(有假为假==0)
2&3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
& 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0010 --2
|或运算:对应的两个二进位有一个为1时,结果位就为1,否则为0。(有真为真==1)
2|3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
| 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0011 --3
^ 异或运算:对应的二进位不同时为1,否则为0。(不同为真==1,相同为假==0)
2^3
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
^ 0000 0000 0000 0000 0000 0000 0000 0011 -- 3
-----------------------------------------
0000 0000 0000 0000 0000 0000 0000 0001 --1
注意:1.相同整数相^的结果是0.2.一个数^另一数两次结果不变3.整数相^跟顺序无关
2^2 2^3^3 3^2^3
010 010 011
010 011 010
--- --- ---
000 001 001
011 011
--- ---
010 010
~ 取反运算:对整数的各二进位进行取反,包括符号位(0变1,1变0,真假互换)
注意:取反是单目操作符 也就是只操作一个数
0000 0000 0000 0000 0000 0000 0000 0010 -- 2
~ -----------------------------------------
1111 1111 1111 1111 1111 1111 1111 1101 --- -3 补码
1000 0000 0000 0000 0000 0000 0000 0011 --- -3 原码
1111 1111 1111 1111 1111 1111 1111 1100 ---- -3 反码
1.计算机里:补码==原码==反码(不是指表现形式相等,是指真实的值相等)
2.正数的补码,反码 , 原码的表现形式是一样的.
3.负数的补码=反码+1; 反码=原码符号位不变其余取反.
取反==原数的反值-1;// 2 :-2-1=-3 -3: 3-1=2
<< 左移:把整数的各二进位全部左移n位,高位丢弃(包括符号位),低位补0。
左移n位其实就是乘以2的n次方(但移动后符号位变化除外,符号位改变则正负改变)
3 <<1 -->6 ---> 3*2的1次方
3 <<2 -->12---> 3*2的2次方
3 <<3 -->24---> 3*2的3次方
0 0000 0000 0000 0000 0000 0000 0011000
1100 0000 0000 0000 0000 0000 0000 0000
>> 右移:把整数的各二进位全部右移n位,符号位不变。高位的空缺是正数补0;
是负数高位是补0或是补1 取决于编译系统的规定;右移n位其实就是除以2的n次方
3>>2 -->1 3/2的1次方=1
3>>2 -->0 3/2的2次方=0
0000 0000 0000 0000 0000 0000 0000 0011
000000 0000 0000 0000 0000 0000 0000 00
printf("3>>2=%d\n",3>>2); //0