原码 反码 补码
-
单目(++,–,!,~,())>算术>(左移、右移)>关系>(&,^,|)>逻辑>条件>赋值>逗号
位运算:~,<<,>>,^,|,& 2进制补码的形式参与运算
原码:有符号的最高位表示符号位,其他位表示大小
反码:正数与原码相同,负数:符号位不变,按位取反(0->1,1->0)
补码:正数与原码相同。 负数:反码+1
补码的补码就是原码。
~按位非:按位取反(0变1,1变0)
<<左移: 低位补0.
>>右移:正数高位补0,负数高位补1
&按位与:同1为1,否则为0
^按位异或:同则为0,异则为1
|按位或:有1为1,否则为0
#include <iostream>
using namespace std;
int main()
{
int x = 0;
/*
int型 4个字节=32位
x的原码:0 0000000 00000000 00000000 00001010
反码:0 0000000 00000000 00000000 00001010
补码:0 0000000 00000000 00000000 00001010
~ 1 1111111 11111111 11111111 11110101 补码(看成原码求补码)
反码1 0000000 00000000 00000000 00001010
补码1 0000000 00000000 00000000 00001011 补码的补码(原码)
-11
~x=-(x+1)
0 1 2 3
-1 -2 -3 -4
*/
cout << ~x << endl;//-11
char c = 10;
/*
整型提升
int型 4个字节=32位
x的原码: 0 0000000 00000000 00000000 00001010
反码:0 0000000 00000000 00000000 00001010
补码:0 0000000 00000000 00000000 00001010
<<2 0 0000000 00000000 00000000 00101000 补码(看成原码求补码)
反码 0 0000000 00000000 00000000 00101000
补码 0 0000000 00000000 00000000 00101000 补码的补码(原码)
40
m<<n结果为m*2的n次幂(没有数据溢出的情况下)
*/
cout << (c << 2) << endl;//40
c = c << 4;//c<<4=160 把160赋值变量c时,数据溢出
cout << (int)c << endl;//-96=160-256
c = -5;
/*
m>>n结果为:
如果m为正数:m/2的n次幂
如果m为负数:如果能整除: m/2的n次幂 不能整除m/2的n次幂-1
x为整数:x>>31,如果结果为0,x正数;如果为-1,x为负数
*/
cout << (c >> 2) << endl;//10/4
x >> 31 ? printf("负数") : printf("正数");
//按位与
/*
5补码 00000101
3补码 00000011
00000001 补码
判断一个正整数x是否为2的n次幂? !(x&x-1)
*/
cout << (5 & 3) << endl;//1
/*
不经过第三方变量交换两个整型变量的值
*/
int a=3, b=5;
//不会产生数据溢出
b = a^b;
a = a^b;
b = a^b;
cout << "a=" << a << ",b=" << b << endl;
char cChar = 0xab;
cChar = ~cChar >> 4 + 1;
cout << (int)cChar << endl;
return 0;
}