当前位置: 首页 > news >正文

c语言-位操作符练习题

文章目录

  • 前言
  • 一、n&(n-1)的运用场景(n为整数)
  • 二、&1 和 >>的应用场景
  • 总结


前言

本篇文章介绍利用c语言的位操作符解决一些练习题,目的是掌握各个位操作符的使用和应用场景。
表1.1为c语言中的位操作符

操作符含义
&按位与
|按位或
^按位异或
~按位取反(包括符合位)
<<左移
>>右移
表1.1 位操作符表

注意:

  1. 位操作符除"~"为单目操作符外,其余均为二目操作符,即有两个操作数
  2. 参加位操作符的对象只能是整型或字符型数据。

一、n&(n-1)的运用场景(n为整数)

题目:求一个整数存储在内存中的二进制位中1的个数(补码中1的个数)

n&(n-1)的过程如下(假设n = 15):
在这里插入图片描述

图1.1 n&(n-1)过程图
不断通过n&(n-1),每一次得到的结果是消去最右边的1;
原理:不断地向左借位,然后利用&操作符消去。 代码实现如下:
int count_2scomplement_3(int num)
{int count = 0;while (num){count++;num = num & (num - 1);}return count;
}

题目:判断一个数是不是2的n次方

这到题依然可以利用n&(n-1)进行解答,如果一个数是2的n次方,则意味只有一个1。如果n&(n-1)的结果为0,那么这个值就是2的n次方。
代码实现如下:

int main()
{int num = 0;scanf("%d", &num);if (0 == (num & (num - 1)))printf("%d is 2^n\n", num);elseprintf("%d is not 2^n\n",num);return 0;
}

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

这道题的思路是:m与n进行异或运算后,得到m和n的不同位,即1的个数就是不同位的个数,此时,这题又回到了统计1的个数,即第一题的解法。
代码实现如下:

int main()
{int m = 0;int n = 0;int ret = 0;scanf("%d %d", &m, &n);int a = (m ^ n);while(a){ret++;a = a&(a-1);}printf("%d", ret);return 0;
}

二、&1 和 >>的应用场景

利用&1和>>可以统计一个二进中1或者0的个数;
利用&1和>>也可以获得任意一个位的值。

题目:求一个整数存储在内存中的二进制位中1的个数(补码中1的个数)

利用&1和>>进行解题,代码实现如下:

int count_2scomplement_2(int num)
{int count = 0;int rightmovetimes = 0;for (rightmovetimes = 0; rightmovetimes < 32; rightmovetimes++){if ((num >> rightmovetimes) & 1){count++;}}return count;
}

num >> rightmovetimes) & 1 == 1,则统计1的个数;为0则统计0的个数。

获取一个整数二进制序列中所有的奇数位和偶数位,分别打印二进制序列
要求:从高位开始打印

这道题的思路依然是利用&1和>>,从高位开始
代码实现如下:

int main()
{int num = 0;scanf("%d", &num);int i = 0;//打印奇数位for (i = 30; i >= 0; i -=2 ){printf("%d", (num >> i) & 1);}printf("\n");//打印偶数位for (i = 31; i >= 1; i -= 2){printf("%d", (num >> i) & 1);}return 0;
}

总结

本篇文章叙述了n&(n-1)和&1、>>的应用场景。

http://www.lryc.cn/news/269463.html

相关文章:

  • 园林机械部件自动化三维测量检测形位公差-CASAIM自动化三维检测工作站
  • o2o生活通全开源尊享版+多城市切换+企业付款+交友IM+平台快报
  • UE4开发BIM程序 的 流程
  • 【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用
  • 【面试题】写一个睡眠函数
  • 4. 云原生之kubesphere基础服务搭建
  • 思福迪运维安全管理系统 任意文件读取漏洞
  • OCR在审核应用落地
  • 借贷协议 Tonka Finance:铭文资产流动性的新破局者
  • Python+Yolov5+Qt交通标志特征识别窗体界面相片视频摄像头
  • 浅谈高并发以及三大利器:缓存、限流和降级
  • 深入ArkUI:深入实战组件text和text input
  • WPF 基础(Binding 二)
  • 限制el-upload组件的上传文件大小
  • 什么是爬虫,为什么爬虫会导致服务器负载跑满
  • 线上隐私保护的未来:分布式身份DID的潜力
  • 服务器被入侵后如何查询连接IP以及防护措施
  • 【开源】基于Vue+SpringBoot的公司货物订单管理系统
  • 2023-12-29 服务器开发-Centos部署LNMP环境
  • CEC2017(Python):五种算法(DE、RFO、OOA、PSO、GWO)求解CEC2017
  • 数字身份验证:跨境电商如何应对账户安全挑战?
  • Nature | 大型语言模型(LLM)能够发现和产生新知识吗?
  • C# 使用ZXing.Net生成二维码和条码
  • Windows系统配置pytorch环境,Jupyter notebook编辑器安装使用(深度学习本地篇)
  • 详解“量子极限下运行的光学神经网络”——相干伊辛机
  • uniapp通过蓝牙传输数据 (安卓)
  • LT8612UX-HDMI2.0 to HDMI2.0 and VGA Converter with Audio,支持三通道视频DAC
  • python gui programming cook,python gui视频教程
  • 亚马逊bsr排名的影响因素,如何提高BSR排名?-站斧浏览器
  • K8s-安全机制