C语言------操作符的巧妙使用

1.计算一个数字二进制补码里面1的个数

(1)方法一

根据这个10进制的整数,对这个数进行%10,/10不断地进行下去,

%10得到最后一位,/10得到舍去最后一位之后剩余的数;

同理得到:二进制就进行%2/2的操作,不断地进行下去,

%2==1就计数,否则就/2,知道结果是0就退出循环;

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

这个里面传参类型设置成unsigned int是因为-1这个特例

但是如果直接输入-1,-1%2不是1,-1/2=0就会直接跳出循环,无法正常计数,所以转换成为无符号整形;

(2)方法二

int countone(int m)
{int count = 0;int i = 0;for(i=0;i<32;i++){if ((m>>i) & 1  == 1){count++;}}return count;
}

这里的m右移i位和1进行按位与运算,32个比特位构成一个循环,依次进行判断输出最后的个数;

(3)方法三

通过这个我们发现m&(m-1)每次都能去掉二进制序列里面后面的一个数字1,这样就可以有几个1就进行几次循环,大大的提高了效率,相比于第二种方法很快,因为第二种无论是否为0都要进行判断,而这种只需要判断是0的数位,但是这种方法难以想到;

int countone(int m)
{int count = 0;while (m){count++;m = m & (m - 1);}return count;
}

这里要先进行加加操作,然后每一次就减少一个0;

2.把一个数字的二进制位的某一位0变成1再变成0

#include <stdio.h>
int main()
{int a = 13;a = a | (1<<4);printf("a = %d\n", a);a = a & ~(1<<4);printf("a = %d\n", a);return 0;
}

比如10:00000000  00000000  00000000  00001010把第5位变成0再恢复1

(1)变成0就是把把1左移4位,进行按位或操作,0变为1,后面的和0或操作,1还是1,0还是0,无影响;

(2)再变成0就是做以后取反和a进行按位与操作,原为数字1就变为0其他的和1进行,1还是1,0还是0

换成其他的数字,该方法也是用,只是需要左移n-1位,n是题目要求的第几位数字,这个例子第五

位进行变化,就左移4位

3.输入2个数字,判断他们的二进制位不同的位数

(1)先进行按位异或,相同就是0,不同就是1;

(2)统计1的个数,就回到了第一题的方法;

#include <stdio.h>
int main(){int a=0;int b=0;int c=0;int count=0;while(scanf("%d %d",&a,&b)!=EOF){c=a^b;while(c){c=c&(c-1);count++;}}printf("%d",count);return 0;
}

4.分别打印一个数字的二进制序列的奇数位和偶数位数字

void Printbit(int num)
{for (int i = 31; i >= 1; i -= 2){printf("%d ", (num >> i) & 1);}printf("\n");for (int i = 30; i >= 0; i -= 2){printf("%d ", (num >> i) & 1);}printf("\n");
}
int main()
{int m = 0;scanf("%d", &m);Printbit(m);return 0;
}

  这个主要难在如何打印:

(1)是1就打印1,是0就打印0;

(2)将这个二进制序列右移并和1进行按位与运算

例如:第一位是奇数位,向右移动31位,和1进行按位与运算,是1就打印1,是0就打印0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes(K8s)的一些重要概念以及术语简短解释

前言 温故而知新&#xff0c;不学就容易忘&#xff0c;本文将迅速介绍k8s的一些关键概念&#xff0c;供随时回顾 正文 Pod&#xff1a;Pod是Kubernetes中最小的部署单位&#xff0c;通常一个Pod内运行一个容器应用。Pod封装了容器&#xff08;可能是多个&#xff09;&#xf…

09 呼吸灯

呼吸灯简介 呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗&#xff0c;再由暗到亮的变化过程&#xff0c;并且该过程是循环往复的&#xff0c;像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation&#xff0c;即脉冲宽度调制) 的方式实现&#xff0c;在…

计算机视觉初探--LeNet原理与实践

LeNet&#xff1a;深度学习图像识别的里程碑 LeNet是卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;领域的先驱模型&#xff0c;由Yann LeCun等人在1998年提出&#xff0c;被广泛应用于手写数字识别和其他计算机视觉任务。本文将介绍LeNet模型的数学…

随想录刷题笔记 —二叉树篇11 538二叉搜索树转换为累加树 77组合

538二叉搜索树转换为累加树 递归&#xff1a;使用pronode标记仅小于该节点的节点&#xff0c;使用右中左的顺序 根据pronode值修改节点值 class Solution {TreeNode pronode null;public TreeNode convertBST(TreeNode root) {if (rootnull){return root;}if (root.right!nu…

深入了解计算机系统——1.计算机系统初步

文章目录 计算机系统信息是什么我们来看看hello在哪 程序被其他程序翻译成不同的格式处理器读取并解释内存中的指令硬件组成 计算机系统 信息是什么 信息是位上下文 下面写一段程序 ...(省略&#xff09; printf("hello world"); ... hello.c上面是一段hello程序…

Vue-Json-Schema-Form: 如何基于模板定制前端页面

本人从事的是工业物联网, 面对工业设备的通讯难题是各大设备都有各自的通讯协议, 如果想要用一款硬件去和所有设备做通讯的话, 就得面对怎么把自己想要采集的配置下发给自己的采集器的问题, 以前都是采用各种模型去尝试构建配置项, 但是因为配置可能会有深层次嵌套, 而且…

13-ATF中的Switch cpu context

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】我的联系方式-自建交流群-学习群 【必看/必看!!】ATF架构开发精讲-专题目录👈👈👈【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈目录 <

如何使用移动端设备在公网环境远程访问本地黑群晖

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

嵌入式26——进程

进程基本概念:1.进程: 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程,包括进程的创建、进程的调度、进程的消亡 2.进程相关命令: 1.top 动态查看当前系统中的所有进程信息&#xff08;根据CPU占用率排序&am…

算法:判断回文数

判断数字是否为回文数&#xff0c;反转后与原数字相同&#xff0c;即为为回文数 方法一&#xff1a;将数字转为字符串&#xff0c;然后利用字符串的反转来判断是否为回文数 首先将数字转换为字符串&#xff0c;然后将字符串转换为数组并反转&#xff0c;最后将反转后的数组转…

C#与VisionPro联合开发——串口通信

串口通信 串口通信是一种常见的数据传输方式&#xff0c;通过串行接口&#xff08;串口&#xff09;将数据以串行比特流的形式进行传输。在计算机和外部设备之间&#xff0c;串口通信通常是通过串行通信标准&#xff08;如RS-232&#xff09;来实现的。串口通信可以用于连接各…

解析OOM的三大场景,原因及实战解决方案

目录 一、什么是OOM 二、堆内存溢出&#xff08;Heap OOM&#xff09; 三、方法区内存溢出&#xff08;Metaspace OOM&#xff09; 四、栈内存溢出&#xff08;Stack OOM&#xff09; 一、什么是OOM OOM 是 Out Of Memory 的缩写&#xff0c;意思是内存耗尽。在计算机领域…

每日OJ题_牛客JZ39 数组中出现次数超过一半的数字

目录 牛客JZ39 数组中出现次数超过一半的数字 解析代码 牛客JZ39 数组中出现次数超过一半的数字 数组中出现次数超过一半的数字_牛客题霸_牛客网 解析代码 摩尔投票法&#xff1a;摩尔投票法&#xff0c;时间O(N)&#xff0c;空间O(1)。 可以理解成混战极限一换一&#xff…

算法沉淀——动态规划之简单多状态 dp 问题(上)(leetcode真题剖析)

算法沉淀——动态规划之简单多状态 dp 问题上 01.按摩师02.打家劫舍 II03.删除并获得点数04.粉刷房子 01.按摩师 题目链接&#xff1a;https://leetcode.cn/problems/the-masseuse-lcci/ 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在…

神经网络系列---常用梯度下降算法

文章目录 常用梯度下降算法随机梯度下降&#xff08;Stochastic Gradient Descent&#xff0c;SGD&#xff09;&#xff1a;随机梯度下降数学公式&#xff1a;代码演示 批量梯度下降&#xff08;Batch Gradient Descent&#xff09;批量梯度下降数学公式&#xff1a;代码演示 小…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解&#xff0c;基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型&#xff0c;源代码放在GitHub上&#xff0c;地址传送点击此处。项目大纲如下&#xff1a; 文章目录 一、问题描述二、数据集处理…

idea使用debug妙招之消息队列kafka多消费者组消费同一Topic

1. 问题场景复现 不同类型的消息发到同一个Topic中&#xff0c;设置多个消费者组&#xff0c;为每个消费者组打一个标记。每一种消费者组只能消费对应的消息类型。这样做的好处是避免设置多个Topic&#xff0c;简化代码开发的同时性能损耗小。问题出现在消费端&#xff0c;由于…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 上一节的课后练习

题目 1277: Lucky Word

题目描述: 笨小猴的词汇量很小&#xff0c;所以每次做英语选择题的时候都很头疼。但是他找到了一种方法&#xff0c;经试验证明&#xff0c;用这种方法去选择选项的时候选对的几率非常大&#xff01; 这种方法的具体描述如下&#xff1a;假设maxn是单词中出现次数最多的字母的…

janus-gateway的videoroom插件的RTP包录制功能源码详解

引: janus-gateway在配置文件设置后&#xff0c;可以实现对videoroom插件的每个publisher的音频&#xff0c;视频&#xff0c;数据的RTP流录制成mjr文件。 对于音频&#xff0c;视频的mjr文件&#xff0c;可以使用自带的postprocessing工具janus-pp-rec转成mp4文件。 每个pu…