【维生素C语言】第五章 - 操作符(五)

简介: 本章将对C语言操作符进行深度的讲解,将每种操作符都单独拿出来精讲。最后添加了些简单的练习题,并配有详细解析。

作业


0x00 选择题

❓  下面哪个是位操作符 (   );


     A. &      B. &&      C. ||      D. !


0x01 分析代码

❓  下列代码运行后的结果是什么


#include <stdio.h>
int main()
{
  int a, b, c;
  a = 5;
  c = ++a;
  b = ++c, c++, ++a, a++;
  b += a++ + c;
  printf("a = %d b = %d c = %d\n:", a, b, c);
  return 0;
}

0x02 交换两个变量(不创建临时变量)

💬 不允许创建临时变量,交换两个整数的内容;


0x03 统计二进制中1的个数

💬  输入一个整数,写一个函数返回该数32位二进制表示中1的个数,其中负数用补码表示。


   ( eg. 15    0000 1111    4个1 )


🐂  牛客网OJ链接:二进制中1的个数__牛客网;


0x04 求两个数二进制中不同位的个数

💬  编程实现:两个 int(32位)整数的 m 和 n 的二进制表达中,有多少个位 (bit) 不同?


   ( eg.  输入 1999 2299   输出 7 )


🐂  牛客网OJ链接:两个整数二进制位不同个数__牛客网;


0x05 打印整数二进制的奇数位和偶数位

💬  说明:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列;


答案


0x00 第一题:选择题

💡 正确答案:A


🔑 解析:

a0246f8680fe66b3035bee44d72c24e9_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

0x01 第二题:下列代码运行结果

💡  正确答案:a = 9   b = 23   c = 8


🔑 解析:

62960d0dc50031f2e9a98d39af09f532_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png

0x02 第三题:不创建临时变量交换两个整数内容

💬 不允许创建临时变量,交换两个整数的内容;


💡 参考答案:


void Swap (
    int* pa,
    int* pb
    )
{
    *pa = *pa ^ *pb;
    *pb = *pa ^ *pb;
    *pa = *pa ^ *pb;
}
int main()
{
    int a = 10;
    int b = 20;
    printf("交换前:a = %d  b = %d\n", a, b);
    Swap(&a, &b);
    printf("交换后:a = %d  b = %d\n", a, b);
    return 0;
}

0x03 第四题:统计二进制中1的个数

💬  输入一个整数,写一个函数返回该数32位二进制表示中1的个数,其中负数用补码表示。


   ( eg. 15    0000 1111    4个1 )


💡 参考答案:


1. 模除法


int CountNum1(int n)
{
    int count = 0;
    while(n) {
        if(n % 2 == 1) {
            count++;
        }
        n /= 2;
    }
    return count;
}
int main()
{
    int num = 0;
    scanf("%d", &num);
    int ret = CountNum1(num);
    printf("%d\n", ret);
    return 0;
}


2. 移位操作符 + 按位与 结合的方式


int CountNum1(int n)
{
    int count = 0;
    int i = 0;
    for(i=0; i<32; i++) {
        if( ((n>>i) & 1) == 1) {
            count++;
        }
    }
    return count;
}
int main()
{
    int num = 0;
    scanf("%d", &num);
    int ret = CountNum1(num);
    printf("%d\n", ret);
    return 0;
}

3.  &=


int CountNum1(int n) 
{
    int count = 0;
    while(n) {
        n = n & (n - 1);
        count++;
    }
    return count;
}
int main()
{
    int num = 0;
    scanf("%d", &num);
    int ret = CountNum1(num);
    printf("%d\n", ret);
    return 0;
}

912afa48795c8d91ae87a0c055d3261f_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MDUwMjg2Mg==,size_16,color_FFFFFF,t_70.png


0x04 第五题:求两个数二进制中不同位的个数

💬  编程实现:两个 int(32位)整数的 m 和 n 的二进制表达中,有多少个位 (bit) 不同?


   ( eg.  输入 1999 2299   输出 7 )


1.   >> & 移位按位与


int main()
{
    int m = 0;
    int n = 0;
    scanf("%d %d", &m, &n);
    int count = 0;
    int i = 0;
    for(i=0; i<32; i++) {
        if( ((m >> i) & 1) != ((n >> i) & 1) ) {
            count++;
        } 
    }
    printf("%d\n", count);
    return 0;
}

2. 异或法,然后统计二进制中有几个1


int NumberOf1(int n) 
{
    int count = 0;
    while(n) {
        n = n & (n - 1);
        count++;
    }
    return count;
}
int main()
{
    int m = 0;
    int n = 0;
    scanf("%d%d", &m, &n);
    int count = 0;
    int ret = m ^ n; // 相同为0,相异为1
    // 统计一下ret的二进制中有几个1,就说明m和n的二进制位中有几个位置不同
    count = NumberOf1(ret);
    printf("%d\n", count);
    return 0;
}


0x05 第六题:打印整数二进制的奇数位和偶数位

💬  说明:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列;


int main()
{
    int n = 0;
    scanf("%d", &n);
    // 获取n的2进制中的奇数位和偶数位
    int i = 0;
    // 打印偶数位
    for(i=31; i>=1; i -= 2) {
        printf("%d ", (n >> i) & 1);
    }
    printf("\n");
    // 打印奇数位
    for(i=30; i>=0; i-=2) {
        printf("%d ", (n >> i) & 1);
    }
    return 0;
}
相关文章
|
14天前
|
存储 编译器 C语言
爱上C语言:操作符详解(下)
爱上C语言:操作符详解(下)
|
26天前
|
算法 测试技术 C语言
【C语言】异或(^)操作符
【C语言】异或(^)操作符
16 0
|
1月前
|
存储 算法 程序员
【c 语言 】位操作符详解
【c 语言 】位操作符详解
39 0
|
1月前
|
存储 编译器 Linux
操作符详解【c语言】
操作符详解【c语言】
|
1月前
|
C语言
【C语言】位操作符详解
【C语言】位操作符详解
22 0
|
1月前
|
存储 编译器 程序员
c语言从入门到实战——操作符详解
C语言操作符指的是程序中用来进行各种计算、逻辑和条件操作的符号或符号组合。 操作符是编程中用于执行特定操作或比较数据的符号。它们根据操作类型分为算术、比较、逻辑和位操作符。算术操作符执行加、减、乘、除等数学运算;比较操作符比较两个值的大小或相等性;逻辑操作符连接多个条件,形成更复杂的逻辑判断;位操作符则直接对整数的二进制位进行操作。了解各种操作符的特性和用法,对于编写高效、准确的代码至关重要。
54 0
|
30天前
|
存储 编译器 程序员
C语言第十六弹---操作符(下)
C语言第十六弹---操作符(下)
|
28天前
|
编译器 C语言 索引
C语言操作符详解(上)
C语言操作符详解(上)
45 0
|
1月前
|
存储 安全 编译器
【 c 语言 】赋值操作符详解
【 c 语言 】赋值操作符详解
85 0
|
1月前
|
存储 算法 编译器
【c 语言】算术操作符详解
【c 语言】算术操作符详解
42 0