知识点2:运算符

运算符

1,运算符后为一个整体
如:a*=b+c; 等价于 a=a*(b+c);

2,关系运算的结果为布尔型。布尔型(bool)数值只有两个值:1和0,即真和假。

3,计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式。也就是说,并不是所有的表达式都被执行。

4,逗号运算符(顺序求值运算符)。
逗号运算符的优先级最低,结合方向自左向右。其功能为:将两个表达式连接起来组成一个表达式(称为逗号表达式)。
其一般格式为:表达式1, 表达式2;
其求值过程为先求解表达式1,再求解表达式2,并以表达式2的值作为整个逗号表达式的值。
推广:表达式1, 表达式2, 表达式3,... ,表达式n;
将表达式n的值作为整个逗号表达式的值。
例如:

int a = 4, b = 6, c = 8, r1, r2;
r1 = a + b, r2 = b + c;
printf("%d, %d", r1, r2);//输出10,14
//本例中r2等于整个逗号表达式的值,即表达式2的值;r1是第一个表达式的值。

例如:x = 1, y = 2, z = 3;x = 1; y = 2; z = 3;相当
程序中使用逗号表达式通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。

int a, b, c, d;
c = (a = 3, 2 * a);//将一个逗号表达式的值赋给c
d = b = 3, 2 * a;//逗号仅作为分隔符
printf("%d,%d,%d,%d\n", a, b, c, d);//3,3,6,3
return 0;

5,位运算

要注意数据类型的字节数
1,按位“或”运算 “|”
按位或运算符“|”是双目运算符,其功能是使参与运算的两数各对应的二进制相或:只要两个数的对应位上有一个1,则结果的该位上就为1。

例如: 3 | 7的算式为 :
0000 0011
0000 0111
—————
0000 0111
又如: 64 | 63的算式为:
0100 0000
0011 1111
——————
0111 1111

从上面的计算过程可以看出,要想使一个二进制数的后6位全为1,只需和63按位或;同理要想使后5位全为1,只需和31按位或即可。
总结:要想将某几位置1,只需与这几位是1的数进行 按位或 操作即可
2,按位“与”运算“ & ”
按位“与”运算符&是双目运算符,其功能是:使参与运算的两数各对应的二进制位相与:只有两个对应的二进制位均为1时,结果位才为1。

例如: 13 & 18的算式为:
0000 1101
0001 0010
—————
0000 0000
可见,按位与运算的一个用途便是:清零。若要原数中为1的位为0,只需将其与该位为0的数相与即可。
又如: 31 & 22的算式为:
0001 1111
0001 0110
—————
0001 0110

可以通过按位与的方式取一个数中某些指定位。比如要取22的后5位,则要与后5位均为1的数相与。
3,取反运算 “ ~ ”
取反运算符“~”为单目运算符,具有右结合性,其功能是对参与运算的数的二进制位形式按位取反:将0变成1,将1变成0。
例如:~19的算式为:
0000 0000 0001 0011 —> 1111 1111 1110 1100
(注意数据类型所占的字节数)
注意 有符号数的最左位为符号位,进行取反后,正负性会改变。但取反结果并不是原数的相反数!
(如果给一个数字进行取反,然后在末尾加1之后在和原来的数字相加一定会等于0,也就是负数的存储方式:一个数取反+000000001=它相反数的补码)
4,“异或”运算 “ ^ ”
按位异或运算符“^”是双目运算符,其功能是使参与运算的两数各对应的二进制位相异或:相异时结果为1,相同时结果为0。

例如: 44 ^ 25的算式为:
0010 1100
0001 1001
—————
0011 0101

异或操作的一个主要用途就是:使特定的位取反

例如:要将69的后4位取反:
0100 0101
0000 1111
—————
0100 1010
总结:想取反哪些位就与这些位为1,其余为为0的数进行异或运算

异或操作的另一个用途是:在不使用临时变量的情况下实现两个变量值的互换
可用如下方法实现:

x = x ^ y;
y = x ^ y;
x = x ^ y;

异或运算经常被用到一些比较简单的加密运算中。
5,“左移”、“右移”运算 “ << ”、“ >> ”
左移、右移运算符都是双目运算符。
“<<”的功能是:把“<<”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。(注意数据类型的字节数!)
例如: a<<2即把a的各二进位向左移动2位。
假设a=0000 0110,左移两位后为0001 1000。a由原来的6变成了24。
说明:当移出位不含1时,左移1位相当于该数乘以2;左移2位相当于该数乘以4…
“>>”的功能是:把“>>”左边的运算数的各二进位全部右移若干位,由“>>”右边的数指定移动的位数。
在进行右移时,对于有符号数,要特别注意符号位的问题:
当为正数时,最高位补0;
当为负数时,最高位补0还是补1取决于编译系统的规定。(补0的称为“逻辑右移”,补1的称为“算术右移”。)

//循环右移
//将x的右端n位先放到z中的高n位中
z = x << (16 - n);
//将x右移n位,其左边高n位补0
y = x >> n;
//将y与z进行 按位或运算
z = z | y;

//综上即:
z = x << (16-n) | x >> n;
//循环移位
//从键盘输入一个八进制数,然后输入要移动的位数(正数表示向右移位,负数表示向左移位),输出移位后的结果。
//Xcode里整型数据占两个字节
#include <stdio.h>

int right(unsigned value, int n)
{
    
    
    unsigned z;
    z = (value >> n) | (value << (16 - n));//循环右移的实现过程
    return (z);
}

int left(unsigned value, int n)
{
    
    
    unsigned z;
    z = (value >> (16-n)) | (value << n);//循环左移的实现过程
    return (z);
}

int main()
{
    
    
    unsigned a;
    int n;
    scanf("%o%d", &a, &n);//输入一个八进制数和要移动的位数
    if (n > 0) printf("%o", right(a, n));
    else
    {
    
    
        n = -n;
        printf("%o\n", left(a, n));
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Shao_yihao/article/details/112788024
今日推荐