鹏哥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;
}
相关推荐
DoraBigHead39 分钟前
小哆啦解题记——异位词界的社交网络
算法
序属秋秋秋44 分钟前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习
木头左2 小时前
逻辑回归的Python实现与优化
python·算法·逻辑回归
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
啟明起鸣6 小时前
【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行
c语言·网络·tcp/ip·p2p
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
风吹落叶花飘荡7 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
失败又激情的man8 小时前
python之requests库解析
开发语言·爬虫·python