• c语言知识点5


    C 运算符
    规则:

    1. 括号成员是老大; // 括号运算符 成员运算符. ->
    2. 全体单目排老二; // 所有的单目运算符比如++、 --、 +(正)、 -(负) 、指针运算*、&
    3. 乘除余三,加减四; // 这个"余"是指取余运算即%
    4. 移位五,关系六; // 移位运算符:<< >> ,关系:> < >= <= 等
    5. 等与不等排行七; // 即 == 和 !=
    6. 位与异或和位或; // 这几个都是位运算: 位与(&)异或(^)位或(|)
    7. "三分天下"八九十;
    8. 逻辑与,逻辑或; // 逻辑运算符: || 和 &&
    9. 十一十二紧挨着; // 注意顺序: 优先级(||) 底于 优先级(&&)
    10. 条件只比赋值高, // 三目运算符优先级排到 13 位只比赋值运算符和 “,” 高
    11. 逗号运算最低级! //逗号运算符优先级最低

    利用异或 ^ 来交换两个数的值,而且不引入其他变量。

     #include<stdio.h>
    int main( )
    {
        unsigned int a=60;         //0011 1100
        unsigned int b=13;         //0000 1101
        printf("a=%d,b=%d",a,b);   //输出a,b的值
        printf("
    ");
        a=a^b;                     //a=a^b=0011 0001
        b=a^b;                     //b=a^b=0011 1100
        a=a^b;                     //a=a^b=0000 1101
        printf("a=%d,b=%d",a,b);   //输出a,b的值
    }

    结果如下:

    a=60,b=13;
    a=13,b=60;

    利用位与 & 运算,判断一个整数是否是2的整数次幂。
    二进制数的位权是以2为底的幂,如果一个整数 m 是 2 的 n 次幂,那么转换为二进制之后只有最高位为 1,其余位置为 0,再观察 m-1 转换为二进制后的形式以及 m&(m-1) 的结果,例如:

    2 --> 0000 0010        1 --> 0000 0001        2&1 --> 0000 0010 & 0000 0001 = 0
    4 --> 0000 0100        3 --> 0000 0011        4&3 --> 0000 0100 & 0000 0011 = 0
    8 --> 0000 1000        7 --> 0000 0111        8&7 --> 0000 1000 & 0000 0111 = 0

    可以看出所有的 1 完美的错过了,根据位与的特点可知 m&(m-1) 的结果为 0。
    如果整数 m 不是 2 的 n 次幂,结果会怎样呢?例如 m=9 时:

    9 --> 0000 1001        8 --> 0000 1000        9&8 --> 0000 1001 & 0000 1000 != 0

    利用这一特点,即可判断一个整数是否是2的整数次幂。

    int func(int num)
    {
        return ((num > 0) && ((num & (num - 1)) == 0));//2的n次幂大于0
    }

    返回值为 1,则输入的正整数为 2 的整数次幂,返回值为 0 则不是。
    对取余运算的说明
    取余,也就是求余数,使用的运算符是 %。C 语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。
    另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
    如果 % 左边是正数,那么余数也是正数;
    如果 % 左边是负数,那么余数也是负数

    #include <stdio.h>
    int main()
    {
        printf( "100%%12=%d 
    100%%-12=%d 
    -100%%12=%d 
    -100%%-12=%d 
    ", 100%12, 100%-12, -100%12, -100%-12 );
        return 0;
    }

    运行结果如下:

    100%12=4
    100%-12=4
    -100%12=-4
    -100%-12=-4

    | 和 ||,& 和 && 的区别
    我们将 || 和 && 定义为逻辑运算符,而 | 和 & 定义为位运算符。
    && 如果两个操作数都非零,则条件为真;
    || 如果两个操作数中有任意一个非零,则条件为真。
    & 按位与操作,按二进制位进行"与"运算。运算规则:(有 0 则为 0)

    0&0=0;   
    0&1=0;    
    1&0=0;     
    1&1=1;

    按位或运算符,按二进制位进行"或"运算。运算规则:(有 1 则为 1)

    0|0=0;   
    0|1=1;   
    1|0=1;    
    1|1=1;

    那么,问题来了,在判断语句中,用 | 还是 ||,& 还是 &&?
    判断语句中为布尔类型,值只有 true 和 false(如果变量值为 0 就是 false,否则为 true)
    举个例子,a=1 b=2
    所以 a>0 这个值为true b>1 这个值为true b>2 这个值为 false
    如 if(a>0&b>1) 我们可以得出 if(true&true),条件成立(true不为0,所以true&true不为0)
    如 if(a>0&&b>1) 我们可以得出 if(true&&true),条件成立(&&两边操作数都非零,所以条件成立)
    如 if(b>2&a>0) 我们可以得出 if(false&true),条件不成立(false为0,false&true为0,条件不成立)
    如 if(b>2&&a>0) 我们可以得出 if(false&&a>0),条件不成立(&&左侧为false,&&运算到此结束,条件不成立)
    可以看出 & 和 && 在判断语句中都可以实现“和”这个功能,不过区别在于 & 两边都运算,而 && 先算 && 左侧,若左侧为 false 那么右侧就不运算了。因此从效率上来说,判断语句中推荐使用 &&(换句话就是逻辑运算就老老实实用逻辑运算符,不然它为啥叫逻辑运算符呢?)
    而 | 和 || 的比较与上类似,不做赘述。
    不同长度的数据进行位运算
    如果两个不同长度的数据进行位运算时,系统会将二者按右端对齐,然后进行位运算。
    以“与”运算为例说明如下:我们知道在 C 语言中 long 型占 4 个字节,int 型占 2 个字节,如果一个 long 型数据与一个 int 型数据进行“与”运算,右端对齐后,左边不足的位依下面三种情况补足:
    (1)如果整型数据为正数,左边补 16 个 0。
    (2)如果整型数据为负数,左边补 16 个 1。
    (3)如果整形数据为无符号数,左边也补 16 个 0。
    a++ 与 ++a 区别在于一个后加,一个先加。

    #include <stdio.h>
    int main(int argc,char *args[])
    {
    	int a = 3,b = 2; 
    	printf("a=%d
    ",a);
    	printf("b=%d
    ",b);
    	printf("%d
    ",a++);
    	printf("%d
    ",++b);
    }

    运行结果如下:

    a=3
    b=2
    3
    3

    别废话,拿你代码给我看。
  • 相关阅读:
    #Flag QBXT学习计划
    #蓝书整理 补充推导 [ 流水作业调度问题 ]
    #luogu整理 种树
    #loj整理 活动安排
    #YBT整理 排序算法的例题
    #YBT整理 排序算法
    CYC很好
    #YBT整理 高精度害死人
    #蓝书整理 流水作业调度问题
    #Flag 年前寒假计划
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707566.html
Copyright © 2020-2023  润新知