C语言:详解操作符(上)

摘要:

本篇,我们将学习C语言中操作符的相关内容,操作符是C语言中重要的元素之一,在我们的代码中处处都有,下面我们将详细介绍操作符的相关内容,并结合一些代码例题加深印象。

目录

一、操作符的分类及介绍

二、进制转换

1、二进制转十进制

         2、二进制转八进制和十六进制

三、 原码、反码、补码

四、移位操作符

1、左移操作符

2、右移操作符

五、位操作符:&、|、^、~

思考题1答案

思考题2答案

思考题3答案


一、操作符的分类及介绍

· 算数操作符:+、-、、/、%
· 移位操作符:<<、>>
· 位操作符:&、|、^ ·
赋值操作符:=、+=、-=、
=、/=、%=、<<=、>>=、&=、|=、^= ·
单目操作符:!、++、–、&、*、+、-、sizeof(类型)
· 关系操作符:>、>=、<、<=、==、!=
· 逻辑操作符:&&、||
· 条件操作符:? :
· 逗号操作符:,
· 下标引用操作符:[ ]
· 函数调用:()
· 结构体成员访问:·、->

这些操作符操作符的中算数操作符,赋值操作符等我已经在之前整理过
算数操作符及算数表达式详解,有疑问的可以点击进去查看,本文主要讲述位移操作符等涉及二进制位的操作符的有关内容,下面我们先讲解一下进制转换。

二、进制转换

我们应该都听说过计算机只能识别0和1,即计算机的内部是按二进制的,但我们通常接触的都是十进制,八进制,或者十六进制。那它们之间的关系是什么呢?又该如何相互转换呢?
其实很简单,二进制的实质就是满2进1、八进制的实质就是满8进1……以此类推,下面我们将详细介绍它们之间应该如何转换

1、二进制转十进制

二进制位每一位分别对应的是1,2,4,8,16,通过观察可以知道,二进制每一位对应的实则就是2的次方数。

如二进制11111111对应的十进制就是377:
在这里插入图片描述

2、二进制转八进制和十六进制

二进制转八进制和十六进制本质上跟二进制转化成十进制本质上一样,就是权数上的差异罢了,但是二进制转换为八进制十六进制是有一些技巧的,三个二进制数字能表示一个八进制数字,四个二进制数字能表示一个十六进制数字。

比如二进制数字11111111,它对应的八进制和十六数字如下:

在这里插入图片描述

三、 原码、反码、补码

整数在内存中的二进制表示形式有原码、反码、补码
对于一个int类型的整形数字,有四个字节即三十二个比特位
00000000000000000000000000000000,其中第一个数字是符号位,如果是1表示是负数,是0表示整数
原码:原码就是十进制数字所对应的二进制数字
反码:反码是原码所有数字取反,如原码为0101,则反码为1010
补码:补码是反码加一,也是数字在电脑中的存储形式

由补码求原码也是相同的操作,即先取反,再加1

四、移位操作符

<< 左移操作符 、>>右移操作符
注意:位操作符只能对整数适用

1、左移操作符

移动规则:左边抛弃,右边补0

#include<stdio.h>
int main()
{
    int a = 2;
    printf("%d", (a << 1));
    return 0;
}

思考一下,所有二进制数字左移1次的时候,有没有乘于2的效果?

2、右移操作符

右移操作符包括两种:算数右移和逻辑右移
其中采用哪种右移方式取决于编译器,市面上常见的编译器都是算数右移

1、逻辑右移:左边用0补充,右边舍去
2、算数右移:左边用原值的符号位补充,右边舍去

算数右移例题:

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

运行结果:2
思考一下,所有二进制数字右移1次的时候,有没有除于2的效果?

五、位操作符:&、|、^、~

位操作符:

1 & //按位与
2 | //按位或
3 ^ //按位异或
4 ~ //按位取反

需要记住的是,位操作符也只能适用于整数
用法通过代码呈现:

#include<stdio.h>
int main()
{
    int num1 = 3;
    int num2 = 5;
    printf("%d\n", num1 & num2);
    printf("%d\n", num1 | num2);
    printf("%d\n", num1 ^ num2);
    printf("%d\n", ~0);
    return 0;
}

通过上述这段代码可以让我们对这几个操作符有一个初步的认识,下面给出几个思考题,请结合自己的理解做答,(答案后期我会追加一篇博客讲解,以便理解,如果需要可以点个关注)


思考题:
1、不创建临时变量(第三个变量),如何实现两个数交换
2、编写代码实现:求一个整数存储在内存中的二进制中1的个数
3、二进制位置0或者置1

思考题1答案

#include<stdio.h>
int main()
{
    int a = 3;
    int b = 5;
    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;
}

思考题2答案

//方法一
#include<stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int count = 0;
    for (int i = 0; i < 32; i++)
    {
        if (n >> i & 1 == 1)
            count++;
    }
    printf("%d", count);
    return 0;
}

//方法二
#include<stdio.h>
int main()
{
    int n = 0;
    int count = 0;
    scanf("%d", &n);
    while (n)
    {
        n = n & (n - 1);
            count++;
    }
    printf("%d", count);
    return 0;
}

思考题3答案

//二进制位置0或者置1
 #include<stdio.h>
int main()
{
    int n = 13;
    n |= (1 << 4);//把第五位改成1
    printf("%d\n", n);
    n = n & (~(1 << 4));//把第五位改成0
    printf("%d", n);
    return 0;
}

结语:

操作符的相关内容还是很多的,这里我们只是讲了一部分,剩下的一些留在下篇再讲,让子弹再飞一会儿

创作不易,还请点赞收藏加关注

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑马头条D1 导学

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示词?没关系,ChatGPT帮你搞定

文章目录 ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示词&#xff1f;没关系&#xff0c;ChatGPT帮你搞定一、把场景描述转为镜头语言二、把镜头语言转换为Prompt三、把Prompt转换为图片 ChatGPT实战100例 - (15) 还不会写 Stable Diffusion (SD) 绘画提示…

指针详解(3)

各位少年&#xff0c;大家好&#xff0c;我是博主那一脸阳光&#xff0c;今天介绍 二级指针 指针数组&#xff0c;还有个指针数组模拟二维数组。 前言&#xff1a;在浩瀚的C语言编程宇宙中&#xff0c;指针犹如一把打开内存世界大门的独特钥匙&#xff0c;它不仅是理解程序运行…

牛客寒假算法基础集训营1 E本题主要考察了贪心

示例1 输入 3 4 3 2 4 5 8 1 2 1 4 2 4 3 1 3 1 1 2 3 6 6 1 2 3 4 5 6 2 3 2 3 3 4 4 5 5 6 6 1 输出 1 1 4 #include<bits/stdc.h> using namespace std; int u0,m,n; int num100,tempnum1;//tempnum表示当前这一组合鸡的排名&#xff0c;num是最终排名 pair<i…

JAVA学习之面向对象

JAVA学习之面向对象 PART ONE&#xff1a;面向对象基础 1.类与对象&#xff1a; 类是一种抽象的概念&#xff0c;它描述了一类具有相似属性和行为的对象的集合。类定义了对象的属性和行为&#xff0c;并且可以作为创建对象的模板。 对象是类的实例&#xff0c;它是类的具体…

[RAM] DRAM 导论:DDR4 | DDR5 | LPDDR5 | GDRR6 | HBM 应运而生

主页&#xff1a;元存储 全文 7700 字&#xff0c;原创请勿转载。 DRAM: where memory meets potential." - Bill Gates 前言 有数据的地方就有存储&#xff0c; 内存是谁都离不开的产品。DRAM主要负责硬盘、主板、显卡等硬件与处理器之间的数据交换。 本博客将介绍D…

STM32--HAL库定时器学习记录(易懂)--持续学习

一、什么是定时器 定时器就是计数器&#xff0c;通过计数完成一系列功能。 二、定时器的分类 定时器分为基本定时器、通用定时器、高级定时器。级别不同&#xff0c;功能不同。级别越高&#xff0c;功能越强。 三、定时器&#xff08;计数器&#xff09;三个重要寄存器 预分…

快速上手AI代码生成:CodeGeeX

1. VSCode等IDE插件直接搜到 CodeGeeX 就可以安装&#xff0c;装上之后&#xff0c;会看到左侧出现了&#xff1a; 2. 登陆以后&#xff0c;在代码区域就可以直接用了。 3. 官网功能说明文档&#xff08;非常简洁清晰&#xff09;&#xff1a; https://zhipu-ai.feishu.cn/wik…

机器学习系列——(九)决策树

简介 决策树作为机器学习的一种经典算法&#xff0c;在数据挖掘、分类和回归等任务中广泛应用。本文将详细介绍机器学习中的决策树算法&#xff0c;包括其原理、构建过程和应用场景。 原理 决策树是一种基于树状结构的监督学习算法&#xff0c;它通过构建一棵树来对数据进行分…

以太网帧格式及ARP协议简介

在以太网中&#xff0c;一个主机和另一个主机进行通信&#xff0c;必须要知道目的主机的MAC地址&#xff08;物理地址&#xff09;&#xff0c;只要知道目的主机的IP地址&#xff0c;就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP&#xff08;Address Resolut…

2024年【熔化焊接与热切割】考试题及熔化焊接与热切割操作证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割考试题根据新熔化焊接与热切割考试大纲要求&#xff0c;安全生产模拟考试一点通将熔化焊接与热切割模拟考试试题进行汇编&#xff0c;组成一套熔化焊接与热切割全真模拟考试试题&#xff0c;学员可通…

京东广告算法架构体系建设--高性能计算方案最佳实践 | 京东零售广告技术团队

1、前言 推荐领域算法模型的在线推理是一个对高并发、高实时有较强要求的场景。算法最初是基于Wide & Deep相对简单的网络结构进行建模&#xff0c;容易满足高实时、高并发的推理性能要求。但随着广告模型效果优化进入深水区&#xff0c;基于Transformer用户行为序列和Att…

网络原理TCP/IP(3)

文章目录 滑动窗口流量控制拥塞控制延迟应答捎带应答 滑动窗口 确认应答策略,对每⼀个发送的数据段,都要给⼀个ACK确认应答.收到ACK后再发送下⼀个数据段.这样做有⼀个比较大的缺点,就是性能较差.尤其是数据往返的时间较长的时候. 为了解决低效率传输&#xff0c;引入了滑动窗…

镜舟科技客户成功团队负责人孟庆欢:湖仓一体将成为数据架构的新范式

大数据产业创新服务媒体 ——聚焦数据 改变商业 随着数字化的概念逐步深入不同领域企业的运营中&#xff0c;业务形态和数字化路径也越来越丰富。这也为企业数据处理、储存的方式提出了更多要求。对于企业&#xff0c;尤其是数据驱动型企业来说&#xff0c;需要强大的解决方案…

STM32F407 CAN 静默回环模式 配置

CAN 静默回环模式 【 Silent_LoopBack】 自发自收&#xff0c;这种方式作“热自检”使用&#xff0c;即自我检查&#xff0c;不干扰总线&#xff0c;也不受总线干扰. 发送&#xff1a;发出的数据&#xff0c;只会传输到自己的输入端&#xff0c;不会影响总线.接收&#x…

隐写术:隐藏信息的秘密艺术

一、引言 隐写术&#xff0c;这个充满神秘色彩的词汇&#xff0c;似乎让我们回到了间谍和秘密特工的时代。但实际上&#xff0c;隐写术在现代社会仍然有着广泛的应用&#xff0c;例如在军事、情报、商业等领域。本文将带你走进隐写术的世界&#xff0c;探索它的原理、应用和防…

Vue3+TS+Vite+Pinia学习总结

VUE3介绍 vue2和vue3之间的区别 因为需要遍历data对象上所有属性&#xff0c;所以如果data对象属性结构嵌套很深&#xff0c;就会存在性能问题。因为需要遍历属性&#xff0c;所有需要提前知道对象上有哪些属性&#xff0c;才能将其转化为getter和setter,所以vue2中无法将data新…

物流平台架构设计与实践

随着电商行业的迅猛发展&#xff0c;物流行业也得到了极大的发展。从最初的传统物流到现在的智慧物流&#xff0c;物流技术和模式也在不断的更新与升级。物流平台作为连接电商和物流的重要媒介&#xff0c;其架构设计和实践显得尤为重要。 一、物流平台架构设计 1. 前端架构设…

Selenium处理Alert弹窗

页面弹窗有 3 种类型&#xff1a; alert&#xff08;警告信息&#xff09; confirm&#xff08;确认信息&#xff09; prompt&#xff08;提示输入&#xff09; 对于页面出现的 alert 弹窗&#xff0c;Selenium 提供如下方法&#xff1a; 序号 方法/属性 描述 1 ac…

leetcode正则表达式匹配问题(困难)

1.题目描述 2.解题思路&#xff0c;这道题自己没做出来&#xff0c;看了官方的题解&#xff0c;感觉对自己来说确实是比较难想的。使用了动态规划的解决方案&#xff0c;这种方案看题解都不一定能看明白&#xff0c;不过有个评论画图讲解的非常明白。其实仔细看题解的话&#…