运算符(C语言)

一、算术运算

1、*、/

+-,CPU在一个周期内可以处理完。

*/在大多数CPU中都是不支持的。
它们可能需要CPU多个周期才能完成,甚至要利用软件的模拟方法去实现。

在arm开发中,*/很可能会被编译器编辑为软件浮点方法。如果是裸机开发,就实现不了,必须借助第三方乘法库/除法库来实现。

如果CPU不支持*/,会导致程序的可移植性变差。

2、%

0%3 = 0   
1%3 = 1 
2%3 = 2  
3%3 = 0  
4%3 = 1 
... ...

应用场景:

  • 取一个范围的数
    例如:给一个任意的数字m,得到一个1到100以内的数字?

    (m % 100)+1 
    
  • M进制的数

  • 循环数据结构的下标


二、逻辑运算

1、&&、||

// 001.c
#include <stdio.h>
int main()
{
    int a = 10;
    int res = 0;
    res = ((a == 10) || printf("======\n"));
    printf("res is %d\n", res);
    return 0;
}
|| 左边的值为真,则不判断右边的值
// 002.c
#include <stdio.h>
int main()
{
    int a = 10;
    int res = 0;
    res = ((a != 10) || printf("======\n"));
    printf("res is %d\n", res);
    return 0;
}
|| 左边的值为假时,才判断右边的值

2、!

逻辑运算的!和位运算的~区别

int a = 0x0;
!a : 真
~a :0xffff

三、位运算

C语言中最接近底层和硬件开发的一种运算。
对嵌入式工程师,应用频率非常高。

1、移位:<<(左移)、>>(右移)

<<(左移):左移1位,相当于2*
m<<n:m*2^n

4 ——  0100
8 ——  1000

int a = b*32 ——> int a = b<<5   // C语言会将b*32转化为b<<5,这样CPU在一个周期内就可以处理完了

-1 * 2 = -2
8bit举例:
-1:
原码:1 0 0 0 0 0 0 1
反码:1 1 1 1 1 1 1 0
补码:1 1 1 1 1 1 1 1    // -1在计算机中全是高电平

-2:
原码:1 0 0 0 0 0 1 0
反码:1 1 1 1 1 1 0 1
补码:1 1 1 1 1 1 1 0
// -1左移1位,最后面一位就空了,就用0补位。
// 可看出,-2是-1左移一位得到的

>>(右移):右移1位,相当于/2
m>>n :m/2^n

// 右移与正负符号有关
int a;  a>>n
unsigned int a;  a>>n
// 这两种情况CPU表现形式是不一样的

右移时,如果是负数,则最左边补1; 如果是正数,最左边补0。

/*003.c*/
#include <stdio.h>
int main()
{
    int a = 10;
    while(a) 
    {
        a = a>>1;   // 当a全0时,就不再循环
    }
    printf("++++++++++\n");
}
/*004.c*/
#include <stdio.h>
int main()
{
    int a = -10;
    while(a) 
    {
        a = a>>1;   // 因为a为负数,首位永远是1,因此a永远无法为0,该循环为死循环
    }
    printf("++++++++++\n");
}

2、&(逐位与)、|(逐位或)

(1)&的应用场景:

  • 屏蔽

    A & 0 —— 0 
    int a = 0x1234;
    a & 0xff00;    // 屏蔽低8位(bit),取出了高8bit
    

硬件中,&也叫清零器(clear)

  • 取出

    A & 1 —— A
    

(2)|的应用场景:

  • 设置为高电平

    A | 1 —— 1
    

硬件中,|也叫设置器(set)

  • 保留

    A | 0 —— A
    

例1:设置一个资源的bit5为高电平,其它位不变。

int a;
a = a | 100000   // 末尾一位是bit0,倒数第2位为bit1 ...

a = a | (0x1<<5)

a | (0x1<<n):将a的第n位设置为高电平。

例2:清除第5位。

int a;

a = a & 0 1 1 1 1 1   // 这个写法是错误的,因为高位为0,会把a的高位也同时都清零;而且,如果移植到别的平台,前面的0更多的话,把把更多位清零。

a = a & (~(0x1<<5))   // 只有第5位为0,其它位全为1

a & (~(0x1<<n)):清除a的第n位。

例3:某几位设置为某个数。
如,想设置4、5、6bit为101,该怎么处理?

3、^(异或)

1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1

硬件上用的不多,主要用在算法上。在设计的数学算法上,会用到^进行加密、解密(AES、SHA1等)。

例:两数交换。

int a = 20;
int b = 30;

// 方法1:引入中间变量。
int c;
c = a;
a = b;
b =c;

// 方法2:不引入中间变量。
a = a ^ b;
b = a ^ b;
a = a ^ b;

4、~(逐位取反)

~0xf0 (32位常量):  0xffff ff0f

四、内存访问符号

对于连续空间中不同成员变量的访问方法:
->:地址访问。
.:变量访问。

&p:取地址。
*p:指针。


五、逻辑结构

switch里面必须用整型数字,不能用浮点数。

内核编程中,有的场景不得不用goto。
一定要保证goto不能在不同函数间跳,在同一函数内是没有问题的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容