操作符练习题

  • 1.求两个数二进制中不同位的个数
    • 1.1 思路
    • 1.2 代码
  • 2.打印整数二进制的奇数位和偶数位
    • 2.1 思路
    • 2.2 代码
  • 3.统计二进制中1的个数
    • 3.1 思路
    • 3.2 代码
  • 4 交换两个变量(不创建临时变量)
    • 4.1 思路
    • 4.2 代码
  • 5.喝汽水问题
    • 5.1 思路
    • 5.2 代码

1.求两个数二进制中不同位的个数

编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7

1.1 思路

(1) 先将m和n进行按位异或,此时m和n相同的二进制比特位清零,不同的二进制比特位为1
(2) 统计异或完成后结果的二进制比特位中有多少个1即可

这里统计一个数中1的个数的方法两种
第一种很容易想到,将数循环右移1位直到数为零,每次与1相与,结果为真表示该位为1。但是这种方法需要注意使用无符号类型,不然左边空位会补符号位1
用unsigned类型是为了保证数在右移时,无论该程序在什么机器上运行,左边空出的位都用0而不是符号位填补。
第二种方法比较巧妙利用x&=(x-1)这个式子每次消除x中最右边值为1的二进制位,循环次数即为1的个数。
我们随便为x-1选一个值,比如二进制1010,x就为1011,x&=(x-1),x为1010
x-1为1001,x&=(x-1),x为1000,
x-1为0111,x&=(x-1),x为0,
循环三次,1011中共3个1,
我们发现x-1最右端为0的位与x最右端为1的位相对应,
两者相与,x&(x-1)就能消除x最右端值为1的位。

1.2 代码

//1.求两个数二进制中不同位的个数
int calc_dif_bit(int m, int n)
{//方法1//unsigned int tmp = m^n;//int count = 0;//while (tmp)//{// if (tmp & 1)//  {//     count++;//    }// tmp >>= 1;// //}//方法2int tmp = m^n;int count = 0;while (tmp){tmp = tmp&(tmp - 1);count++;}return count;}int main()
{int m = 0;int n = 0;while (scanf("%d %d", &m, &n) == 2){int sum = calc_dif_bit(m, n);printf("%d\n", sum);}system("pause");return 0;
}

2.打印整数二进制的奇数位和偶数位

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

2.1 思路

(1)提取所有的奇数位,如果该位是1,输出1,是0则输出0
(2) 以同样的方式提取偶数位置

检测num中某一位是0还是1的方式:
(1) 将num向右移动i位
(2)将移完位之后的结果与1按位与,如果:
结果是0,则第i个比特位是0
结果是非0,则第i个比特位是1

2.2 代码

//2.打印整数二进制的奇数位和偶数位void PrintBit(int num)
{printf("奇数位:");for (int i = 31; i >= 1; i-=2){printf("%d ", (num >> i) & 1);}printf("\n");printf("偶数位: ");for (int i = 30; i >= 0; i-=2){printf("%d ", (num >> i) & 1);}printf("\n");
}int main()
{int num = 0;scanf("%d", &num);PrintBit(num);system("pause");return 0;
}

3.统计二进制中1的个数

写一个函数返回参数二进制中 1 的个数。
比如: 15 0000 1111 4 个 1
牛客网OJ链接

3.1 思路

该题思路可以参考第一题的思路,两种方法:按位与1(注意符号)或者按位与它本身-1。
采用相邻的两个数据进行按位与运算
举例:
9999:‭10 0111 0000 1111‬
第一次循环:n=9999 n=n&(n-1)=9999&9998= 9998
第二次循环:n=9998 n=n&(n-1)=9998&9997= 9996
第三次循环:n=9996 n=n&(n-1)=9996&9995= 9992
第四次循环:n=9992 n=n&(n-1)=9992&9991= 9984
第五次循环:n=9984 n=n&(n-1)=9984&9983= 9728
第六次循环:n=9728 n=n&(n-1)=9728&9727= 9216
第七次循环:n=9216 n=n&(n-1)=9216&9215= 8192
第八次循环:n=8192 n=n&(n-1)=8192&8191= 0
可以观察下:此种方式,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效

3.2 代码

//3.统计二进制中1的个数
int CalcBit(int num)
{//方法1unsigned int tmp = num;int count = 0;while (tmp){if (tmp & 1){count++;}tmp >>= 1;}方法2//int count = 0;//while (num)//{//   num = num&(num - 1);// count++;//}return count;
}int main()
{int num = 0;while (scanf("%d", &num) == 1){printf("%d个1",CalcBit(num));}system("pause");return 0;
}

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

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

4.1 思路

使用异或操作,异或操作满足结合律
a=a^b
b=a^b 即:b=a ^ b ^ b =a
a=a^b 即:a=a ^ b ^ b =a

4.2 代码

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

5.喝汽水问题

喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。

5.1 思路

(1)20元首先可以喝20瓶,此时手中有20个空瓶子
(2)两个空瓶子可以喝一瓶,喝完之后,空瓶子剩余:empty/2(两个空瓶子换的喝完后产生的瓶子) + empty%2(不够换的瓶子)
(3) 如果瓶子个数超过1个,可以继续换,即重复2

5.2 代码

int main()
{int money = 0;scanf("%d", &money);int total = money;int empty = money;while (empty > 1){total += empty/2;empty =empty/2+empty%2;}printf("%d\n", total);return 0;}

C语言习题——练习1相关推荐

  1. 用c语言实现单链表的初始化,建表,查找,求长度,插入,删除等操作,【YTU+2430+C语言习题+链表建立+插入+删除+输(5)...

    的打印.判断链表是否为空.计算链表长度.插入节点.删除节点.删除整个链表.(2) 线性表adt顺序存储实现中的创建.查找.插入和删除等基本操作及相关算法,线性表adt链式存储实现中单链表.循环链表和双 ...

  2. c语言上机指导答案清华,第一章自测练习答案清华大学c语言习题实验指导及课程设计...

    第一章自测练习答案清华大学c语言习题实验指导及课程设计 第一章 自测练习参考答案 一.简答题 1.源程序是程序员创建的,目标程序是编译器创建的,可执行程序是连接器创建的. 2.步骤如下:1)说明程序需 ...

  3. Problem B: C语言习题 矩阵元素变换

    Problem B: C语言习题 矩阵元素变换 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 942  Solved: 558 [Submit][St ...

  4. Problem G: C语言习题 医生值班

    Problem G: C语言习题 医生值班 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 847  Solved: 102 [Submit][Stat ...

  5. Problem B: C语言习题 学生成绩输入和输出

    Problem B: C语言习题 学生成绩输入和输出 Description 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据,每个学生的数据包括num(学号).name(姓名 ...

  6. c语言编程从键盘上输入两个整数m和n,C语言习题 求键盘输入的两个正整数的最大公约数和最小公倍数...

    C语言习题 求键盘输入的两个正整数的最大公约数和最小公倍数以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言习题 求 ...

  7. 2017年3月计算机二级c语言真题,2017年3月计算机二级C语言习题及答案

    2017年3月计算机二级C语言习题及答案 在复习阶段多做练习可以帮助我们巩固知识和提高做题速度以及掌握做题技巧等.下面是百分网小编为大家整理的2017年3月计算机二级C语言习题及答案,希望可以帮助到大 ...

  8. c语言第五章答案许合利,C语言习题答案贾宗璞许合利较全-.doc

    <C语言习题答案贾宗璞许合利较全-.doc>由会员分享,可在线阅读,更多相关<C语言习题答案贾宗璞许合利较全-.doc(45页珍藏版)>请在装配图网上搜索. 1.参考答案习题一 ...

  9. c语言答案-贾宗璞 许合利,C语言习题答案贾宗璞许合利较全-.doc-资源下载在线文库www.lddoc.cn...

    C语言习题答案 贾宗璞 许合利 较全-.doc 1参考答案习题一1. 选择题CBACD2. 填空题1) main2) main3) 有穷性.确定性.有效性.0 个到多个输入.1 个到多个输出4) 顺序 ...

  10. C语言习题:猜数字游戏(C语言随机数)

    C语言习题:猜数字游戏(C语言随机数) 需要了解C语言随机数的生成方法: 在C语言中比较常用的随机函数是 rand 函数,它可以随机的产生 0 ~ rand_max 的随机数,定义类型不同最大值也不同 ...

最新文章

  1. 2014百度面试题目---“求比指定整数大且最小的不重复数”解答
  2. 2018/12/08 L1-042 日期格式化 Java
  3. 波士顿大学数学与计算机科学,2021战报 | 美国波士顿大学金融数学硕士录取
  4. 大数据WEB阶段Spring框架 AOP面向切面编程(一)
  5. python调用支付宝支付接口详细示例—附带Django demo代码
  6. CRM User status optimization - heavy calculation logic of status filter
  7. jzoj3890-长途旅行【同余最短路】
  8. 强大的Canvas开源库Fabric.js简介与开发指南
  9. SparkSql之DataFrame操作
  10. c ++异常处理_C ++中的异常处理
  11. 正则表达式(待补充)
  12. html内容超出不自动滚动,16.css: overflow使用 例: 固定div大小,不让内容超出div
  13. 离开谷歌之后,很难再享受到这些称手的开发工具了
  14. 花音机器人_氧叔在“难红难在哪儿”系列中分析曾黎时提到:
  15. 台式计算机是32位还64位,电脑系统装64位还是32位系统好?考虑这些才能正确安装...
  16. 能快速修改视频格式的工具分享
  17. mqtt简介及在web端的应用(接入阿里iot)
  18. IP地址及相关计算方法知识
  19. img取消无图片时的默认边框
  20. 验证手机号码 (包含166和199)

热门文章

  1. 复旦计院2020机试真题
  2. Ackerman非递归算法Java实现
  3. SAP 批量修改工艺路线
  4. Fritzing软件绘制Arduino面包板接线图传感器模块库文件140
  5. XDOJ 字符串压缩 C
  6. IOT技术在农业生产上的应用
  7. 从零开始vim搭建Java开发环境[视频]
  8. jml java msn_使用jml 取得MSN好友列表
  9. python机器视觉车牌识别_2车牌识别与深度学习
  10. SAP各种凭证的冲销