目录
一.逻辑运算
> ,< , == ,>= ,<= ,!=
运算结果为bool型;
二.逻辑运算符
逻辑非! :真则为假,假则为真;
逻辑与&&:同真为真,否则为假。当前面式子为假,后面式子不参与运算;
int a=0,b=1; if(a+b>2&&a+b>0)//a+b=1<2 为假,不需要判断a+b>0 { cout<<a+b<<endl; } else cout<<a-b<<endl; //输出为-1;
逻辑或||:同假为假,否则为真。当前面式子为真,后面式子不参与运算;
int a=0,b=1; if(a+b<2||a+b<0)//a+b=1<2 为真,不需要判断a+b<0 { cout<<a+b<<endl;//输出为1 } else cout<<a-b<<endl;
三.条件运算符
?:
a?b:c 如果a为真,结果为b,否则为c;
四.位运算符
2进制补码的形式参与运算
原码:最高位表示符号位,其他位表示大小;
反码:正数反码与原码相同,负数符号位不变,按位取反;
补码:正数补码与原码相同,负数符反码+1;
按位非~: 按位取反
公式 ~n=-(n+1);
按位与&:同1为1,否则为0
按位异或^:同则为0,否则为1;
按位或|:同0为0,否则为1;
左移:<< 地位补0
公式:n<<m n*(2)^m 等价与n乘以2的m次方
右移:>> 正数高位补0,负数高位补1;
公式: n>>m 如果n为正数 等价于n除以2的m次方
如果n为负数 能整除 等价于n除以2的m次方
不能整除 等价于n除以2的m次方-1
特殊的复合位运算:
2的n次幂:!(x&(x-1))
1.当我们从2的幂中减去1时,我们得到一个数字,其中所有的位都被翻转,除了最右边的一位。例如,8(即2的3次幂)的二进制表示为1000。当我们从它减去1时,得到的是0111的二进制表示。
2.如果我们对一个2的幂和它的前一个数(即x和x-1)执行按位与(&)操作,我们得到一个数字,只有最右边的位被设置为0。例如,如果x=8,则x&(x-1)=1000 & 0111 = 0000。同样,如果x=16,则x&(x-1)=10000 & 01111 = 00000。
3.因此,如果x是2的幂,则x&(x-1)将为0。否则,它将是一个非零数字,只有最右边的位被设置为1。
奇偶数判断:x&1?"奇数":"偶数";
1.当我们对一个数x进行按位与(&)操作时,如果x的最右边一位为1,那么结果就是1;否则,结果为0。
2.因此,当x&1为1时,x的最右边一位为1,也就是x是奇数;当x&1为0时,x的最右边一位为0,也就是x是偶数。
3.最后,根据x&1的结果,表达式返回"奇数"或"偶数"。如果x&1为真(即非0),则返回"奇数";否则,返回"偶数"。
判断正负数 n>>31?"负数":"正数"
1.当我们对一个整数n进行算术右移(>>)操作时,如果n是正数,则最高位为0,算术右移后最高位填充0,结果仍为正数;如果n是负数,则最高位为1,算术右移后最高位填充1,结果仍为负数。
2.在32位计算机中,n>>31的结果将是一个32位整数,其中最高位为n的符号位。如果n是正数,则n>>31等于0;如果n是负数,则n>>31等于-1(即32位二进制表示为全1)。
3.最后,根据n>>31的结果,表达式返回"负数"或"正数"。如果n>>31为真(即等于-1),则返回"负数";否则,返回"正数"。
题目讲解:
char a=0xA3,b=^a>>4+1;
解:
a=163;
10100011数据溢出
163-256=-93;
a应该为-93
93
10000000 00000000 00000000 01011101
11111111 11111111 11111111 10100010//反码
11111111 11111111 11111111 10100011//补码
按位~
00000000 00000000 00000000 01011100
>>5
00000000 00000000 00000000 00000010
(int)b=2;
有关数据溢出请看:
其他运算符请看: