鹏哥C语言86-1---第14次作业:操作符的使用

#define _CRT_SECURE_NO_WARNINGS

cpp 复制代码
#include <stdio.h>
#include <string.h>

//--------------------------------------------------------------------------------第14次作业:操作符的使用

//-----------------------------------------------------------------------------------1.位操作符

&----按(2进制补码)位与(全1 为 1)

| ----按(2进制补码)位或(有1则1,全0则0)

^ ----按(2进制补码)位异或(相同为0,相异为1)

//-----------------------------------------------------------------------------------2.代码结果

下列代码结果为 B

cpp 复制代码
int main()
{
    int a, b, c;
    a = 5;
    c = ++a;
    b = ++c, c++, ++a, a++; //逗号表达式,b = ++c 这是一个表达式,c++这是第二个表达式
    b += a++ + c;
    printf("a =%d b =%d c =%d\n:", a, b, c);
    return 0;
}

A.a = 8 b = 23 c = 8

B.a = 9 b = 23 c = 8

C.a = 9 b = 25 c = 8

D.a = 9 b = 24 c = 8

//---------------------------------------------------------------------------------5.编程题:统计2进制中1的个数

//写一个函数返回参数的2进制中1 的个数

//--------------------------------------------------------------方法1

cpp 复制代码
//int Num(int a) // 只能算正数
int Num(unsigned int a)  //改成无符号数
{
    int count = 0;
    //转化为2进制 %2 /2
    while (a)
    {
        if ((a % 2) == 1)
        {
            count++;
        }
        a = a / 2;
    }
    return count;
}

//--------------------------------------------------------------方法2:按位与&

cpp 复制代码
int Num(int a)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; i++) //循环32次,效率略低
    {
        if (((a >> i) & 1) == 1) 
        //把 a 二进制序列中的每一位数,依次右移 i 位,都跟1按位与一遍,
        //如果结果为1,则说明 a 的该位为1,则计数
        {
            count++;
        }
    }
    return count;
}

//--------------------------------------------------------------方法3:n=n&(n-1)

//如果要判断一个数是不是2的n次方?

if(n&(n-1)==0)

{

printf("是2的n次方");

}

//1000 n ---------2的n次方 n&(n-1)==0

//0111 n-1

cpp 复制代码
int Num(int a)
{
    int count = 0;
    while (a)
    {
        a = a & (a - 1);
        count++;
    }
    return count;
}

//n = 15

//n = n&(n-1)

//1111 n

//1110 n-1

//1110 n

//1101 n-1

//1100 n

//1011 n-1

//1000 n

//0111 n-1

//0000 n

//--------------------------------------------------主函数

cpp 复制代码
int main()
{
    int a = 0;
    scanf("%d", &a);
    int ret = Num(a);
    printf("%d\n", ret);
    return 0;
}

//----------------------------------------------------------------------3.编程题:求两个数二进制中不同位的个数

两个整型(32位)整数m和n的二进制表达式中,有多少个位不同

输入 1999 2299

输出 7

//----------------------------------------------方法一:两个数同时 按位与&1 相比较

cpp 复制代码
int Num(int x, int y)
{
    int count = 0;
    int i = 0;
    for (i = 0; i < 32; i++) //循环32次
    {
        if (((x >> i) & 1) != ((y >> i) & 1))
        {
            count++;
        }
    }
    return count;
}

//----------------------------------------------方法二:^异或操作符

cpp 复制代码
int Num(int x, int y)
{
    int count = 0;
    int n = x ^ y;  //对应2进制位,相同为0,相异为1
    while (n)
    {
        n = n & (n - 1);      // 统计  x ^ y 中 有几个1
        count++;
    }
    return count;
}

//--------------------------------------------------------------主函数

cpp 复制代码
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d", &a, &b);
    int ret = Num(a, b);
    printf("%d\n", ret);
    return 0;
}

//----------------------------------------------------------4.编程题:打印整数二进制的奇数位和偶数位

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

cpp 复制代码
int main()
{
    int a = 0;
    scanf("%d", &a);
    int i = 0;
    //获取奇数位
    for (i = 30; i >= 0; i -= 2)
    {
        printf("%d ", ((a >> i) & 1));
    }
    printf("\n");
    //获取偶数位
    for (i = 31; i >= 1; i -= 2)
    {
        printf("%d ", ((a >> i) & 1));
    }

    return 0;
}

//----------------------------------------------------------------------6.编程题:交换两个变量,不创建临时变量

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

cpp 复制代码
int main()
{
    int a = 3;
    int b = 5;
    //---------------------------------------创建临时变量
    int c = 0;
    printf("交换前a=%d b=%d\n", a, b);
    c = a;
    a = b;
    b = c;
    printf("交换后a=%d b=%d\n", a, b);

    //----------------------------------------异或^操作符
    printf("交换前a=%d b=%d\n", a, b);
    a = a ^ b;  //a=3^5
    b = a ^ b;  //b=3^5^5-->b=3
    a = a ^ b;  //a=3^5^3-->a=5
    printf("交换后a=%d b=%d\n", a, b);

    return 0;
}
相关推荐
zylyehuo7 分钟前
C++提高编程
c++
l1t22 分钟前
分析xml标签属性和压缩级别对xlsx文件读取解析的影响
xml·开发语言·python·sql·duckdb
qq_4112624228 分钟前
为什么会“偶发 539/500 与建连失败”
服务器·c语言·网络·智能路由器
scx2013100431 分钟前
20250822 组题总结
c++·算法
Jenkinscao35 分钟前
我从零开始学习C语言(13)- 循环语句 PART2
c语言·开发语言·学习
王伯爵1 小时前
go语言中的select的用法和使用场景
开发语言·数据库·golang
智驱力人工智能1 小时前
智慧工厂烟雾检测:全场景覆盖与精准防控
人工智能·算法·安全·智慧城市·烟雾检测·明火检测·安全生产
Chandler_Song1 小时前
【Python代码】谷歌专利CSV处理函数
开发语言·python·pandas
白书宇1 小时前
12.从零开始写LINUX内核--控制台初始化
linux·c语言·驱动开发·嵌入式硬件·microsoft·iot
我是一只菜菜1 小时前
中国大学MOOC--C语言第十一周结构类型
c语言·开发语言