【C语言】位与移位操作符详解

目录

1.⼆进制和进制转换

①十进制:生活中最常用

②二进制:计算机中使用的,每个数字称为一个比特

③八进制、十六进制也如上

④二进制转十进制

⑤十进制转二进制

⑥二进制转八进制

⑦二进制转十六进制

2.原码、反码、补码

3.移位操作符(对于数值的二进制操作)

①左移操作符<<

②右移操作符>>

4.位操作符:&、|、^、~

①按位与&

②按位或|

③按位异或^

 ④按位取反~

5.结语



对于C语言中位操作符的介绍首先我们要先了解一些预备知识

1.⼆进制和进制转换

    其实2进制、8进制、10进制、16进制是数值的不同表⽰形式⽽已。

   例如:

   数值15的各种进制的表⽰形式:

二进制1111
八进制17
十进制15
十六进制F

①十进制:生活中最常用

(1)逢十进一

(2)数字每一位由0~9中的数字组成

②二进制:计算机中使用的,每个数字称为一个比特

(1)逢进一

(2)数字每一位由0~1中的数字组成

③八进制、十六进制也如上

④二进制转十进制

其实各种进制的每一位都是有相对应的权重的,例如十进制中123为什么是这个值呢?

10进制的位123
权重10^{2}10^{1}10^{0}
求值1 * 100   +    2 * 10      +3 * 1      =     123

我们可以看到十进制从右往左个、十、百...位权重依次是10^{0}10^{1}10^{2}...

2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2^{0}2^{1}2^{2}...
例如:
二进制的位110
权重2^{2}2^{1}2^{0}
求值1 * 4       +       1 * 2       +       0 * 1        =       6    

⑤十进制转二进制

⑥二进制转八进制

8进制的数字每⼀位是 0~7 的,0~7的数字,各⾃写成2进制,最多有 3个2进制位 就⾜够了,比如7的二进制是111,所以在2进制转8进制数的时候,从2进制序列中右边低位开始向左每3个2进制位会换算一个8进制位,剩余不够3个2进制位的直接换算。

 例如:

 

⑦二进制转十六进制

16进制的数字每⼀位是 0~9,a ~f 的,0~9,a ~f的数字,各⾃写成2进制,最多有4个2进制位就⾜够了,⽐如 f 的⼆进制是1111,所以在2进制转16进制数的时候,从2进制序列中右边低位开始向左每4个2进制位会换算⼀个16进制位,剩余不够4个⼆进制位的直接换算。
如:2进制的01101011,换成16进制: 0x6b ,16进制表示的时候前⾯加0x

2.原码、反码、补码

①整数的二进制表示方法有三种:原码、反码、补码
②有符号整数三种表示方式均有 符号位数值位两部分,在二进制序列中 最高的一位是符号位,其余的是数值位;
③符号位的0表示“ ”,1表示“ ”;

原码:直接将数据翻译成二进制的形式就可以

   例:10 翻译成二进制就是 1010 再根据数据开辟的内存空间补充0或1就可(正数符号位        即第一位补0负数符号位补1,其余都补0)

     int 10就是开辟了4个字节有32个比特位即00000000 00000000 00000000 00001010为         二进制表示

      int -10的二进制原码即为10000000 00000000 00000000 00001010

反码:将原码的符号位不变其余按位取反

   例:int -10反码:11111111 111111111 11111111 11110101

补码:反码+1即可

    例:int -10补码:11111111 11111111 11111111 11110110

注意:1.正数的原码、反码、补码相同

           2.对于整型来说:数据在内存中存放的是补码

存放补码的原因在于:

在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算 过程是相同的,不需要额外的硬件电路.

3.移位操作符(对于数值的二进制操作)

<< 左移操作符
>> 右移操作符
注: 移位操作符的操作数只能是 整数

①左移操作符<<

规则:左边抛弃,右边补零

②右移操作符>>

规则:

⾸先右移运算分两种:

1. 逻辑 右移:左边⽤0填充,右边丢弃
2. 算术 右移:左边⽤原该值的符号位填充,右边丢弃
注: 对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1;//error

4.位操作符:&、|、^、~

&        //按位与    将两操作数二进制每一位对比同时为1时结果为1,否则为0
|        //按位或    同时为0时为0,其余为1
^        //按位异或  相同为0,否则为1
~        //按位取反  同反码的运算

:它们的操作数必须是整数负数用二进制的补码进行运算

例如:

#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;
}

结果如下:

①按位与&

-3取其补码

按位与同数学中的逻辑运算与,同真才为真(两个都是1才为1),其余为假(0);

②按位或|

按位或类似于数学中逻辑与算符或:

只要有一个真则为真其余为假(只要有一个1则为1,其余为0)

 

③按位异或^

相异为真(01则为1,其余为0)

 

 ④按位取反~

取相反值就行

5.结语

位与移位操作符是c语言学习中的一个难点,其关键在于对于二进制的了解与使用,熟悉各种操作符的使用规则,以上就是今天学习的内容啦~

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

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

相关文章

C++生成动态库给C#使用

在C中编写库文件供C#使用的过程可以分为以下几个步骤&#xff1a; 创建C项目并定义需要导出的函数或类。确保这些函数或类被正确地标记为extern "C"&#xff08;对于C语言&#xff09;或者__declspec(dllexport)&#xff08;对于Windows平台&#xff09;。 示例代码 …

SpringBoot实现即时通讯

SpringBoot实现即时通讯 功能简述 好友管理群组管理聊天模式&#xff1a;私聊、群聊消息类型&#xff1a;系统消息、文本、语音、图片、视频会话列表、发送消息、接收消息 核心代码 package com.qiangesoft.im.core;import com.alibaba.fastjson2.JSONObject; import com.q…

【已更新】2024美赛C题代码教学思路数据处理数学建模分析Momentum in Tennis

问题一完整的代码已给出&#xff0c;预计2号晚上或者3号凌晨全部给出。 代码逻辑如下&#xff1a; C题第一问要求我们开发一个模型&#xff0c;捕捉得分时的比赛流程&#xff0c;并将其应用于一场或多场比赛。你的模型应该确定哪名球员在比赛的特定时间表现得更好&#xff0c;…

AI-数学-高中-24-三角函数一般形式的各参数含义

原作者视频&#xff1a;三角函数】12三角函数一般形式的各参数含义&#xff08;易&#xff09;_哔哩哔哩_bilibili 1.函数中的A标识符&#xff1a;表示曲线中间平衡位置的振幅&#xff0c;值域为正负A&#xff1a;[-A,A]。 2.函数中的B标识符&#xff1a;决定曲线纵向上下平移…

Name or service not known问题解决和分析过程解析

目 录 一、问题描述 二、问题查处过程 &#xff08;一&#xff09;为何不能识别到bogon &#xff08;二&#xff09;为何会出现bogon &#xff08;三&#xff09;能不能更改bogon &#xff08;四&#xff09;能识别其他host的名字 三、问题分析 四、问题解决 …

git 克隆拉取代码出现私钥权限问题。

问题反馈&#xff1a; rootdd:~/android/boost-1.74-for-android-r20b# git clone https://github.com/liulilittle/boost-1.74-for-android-r20b.git Cloning into boost-1.74-for-android-r20b... WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0777 for /root/…

C++多态,父类有virtual, 子类继承时, 会拷贝父类的虚函数表吗

在 C 中&#xff0c;在父类中声明的虚函数会在子类中被继承&#xff0c;并且子类中所生成的对象如果重写了父类中的虚函数&#xff0c;其虚函数表将被更新以指向重写后的函数地址。因此&#xff0c;子类不需要再次拷贝一份父类的虚函数表&#xff0c;可以直接继承父类的虚函数表…

基于 SpringBoot 和 Vue.js 的权限管理系统部署教程

大家后&#xff0c;我是 jonssonyan 在上一篇文章我介绍了我的新项目——基于 SpringBoot 和 Vue.js 的权限管理系统&#xff0c;本文主要介绍该系统的部署 部署教程 这里使用 Docker 进行部署&#xff0c;Docker 基于容器技术&#xff0c;它可以占用更少的资源&#xff0c;…

C#面:Error 和 Exception 的区别

在C#中&#xff0c;Error 和 Exception 是两个不同的概念。 Error&#xff08;错误&#xff09;&#xff1a; 是指在程序运行过程中发生的严重问题&#xff0c;它表示了一个不可恢复的错误&#xff0c;通常是由于系统级别的问题导致的。例如&#xff0c;内存溢出、栈溢出、死…

【Android】代码混淆简单介绍

1.代码混淆的目的 1.1增加代码的安全性和保护知识产权。当开发人员编写的代码被编译成可执行文件后&#xff0c;存在被反编译的风险。通过进行代码混淆&#xff0c;可以使得反编译后的代码难以理解和分析&#xff0c;从而增加攻击者逆向工程的难度。 1.2代码混淆通过对代码进…

C++进阶--C++11包装器

目录 一、function包装器1.1 function包装器的概念1.2 function包装器实例化&#xff08;统一类型&#xff09;1.4 function包装器的意义 二、bind包装器2.1 bind包装器的概念2.1.1 bind包装器2.1.2 调用bind的一般形式 2.2 bind包装器绑定固定参数2.2.1 无意义的绑定2.2.2 绑定…

Redis系列——Lua脚本和redis事务的应用

介绍 Lua脚本 背景 Redis是一种抽象数据类型的特定领域语言&#xff0c;由各种命令组成。大多数命令专门用于操作不通的数据类型。每次发送命令均需要执行至此网络请求。所以Redis提供了一个编程接口&#xff0c;支持服务器执行用户自定义的任意脚本。有助于减少网络流量&am…

linux文件的IO函数

open函数: 作用&#xff1a;打开或者新建一个文件 原型&#xff1a; int open(const char*pathname,int flags); int open(const char*pathname,int flags,mode_t mode); 参数&#xff1a; pathname:路径 flags:1-> O_RONLY 只读打开 2 -> O_WONLY只写打开 3->…

83 CTF夺旗-Python考点SSTI反序列化字符串

这里写目录标题 CTF各大题型简介演示案例:CTF夺旗-Python-支付逻辑&JWT&反序列化CTF夺旗-Python-Flask&jinja2&SSTl模版注入CTF夺旗-Python-格式化字符串漏洞&读取对象 涉及资源&#xff1a; 我们这篇文章主要讲的是CTF在web渗透测试方向的3个考点 CTF各大…

elementui常用组件-个人版(间断更新)

Dialog 对话框 el-dialog <el-dialogtitle"提示":visible.sync"dialogVisible"width"30%":before-close"handleClose"><span>这是一段信息</span><span slot"footer" class"dialog-footer"…

代码随想录算法训练营|day25

第七章 回溯算法 216.组合总和III17.电话号码的字母组合代码随想录文章详解总结 216.组合总和III 回溯&#xff1a;i宽度约束&#xff0c;sum深度约束 func combinationSum3(k int, n int) [][]int {res : [][]int{}path : []int{}var help func(startIndex, sum, k, n int)h…

开源一套直播平台

博主开源一套直播平台,私信博主可获取源码 直播平台系统界面介绍

微信小程序(三十六)事件传参

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.传参步骤 2.传参接收解构步骤 源码&#xff1a; index.wxml <button type"primary" bind:tap"onclick" mark:index"{{0}}" mark:remb"{{1}}" class"But&quo…

产品经理--分享在项目中产品与研发之间会遇到的问题 在面试这一岗位时,面试官常问的问题之一,且分享两大原则来回答面试官这一问题

目录 一.STAR原则 1.1 简介 1.2 如何使用 1.3 举例说明 二.PDCA原则 2.1 简介 2.2 如何使用 2.3 运用场景 2.4 举例说明 三.产品与研发的沟通痛点 3.1 沟通痛点的原因 3.2 分享案例 前言 本篇会详细阐明作为一个产品经理会在项目遇到的问题&#xff0c;如&#xff1a;产…

力扣_字符串4—编辑距离

题目 给你两个单词 w o r d 1 word1 word1 和 w o r d 2 word2 word2&#xff0c; 请返回将 w o r d 1 word1 word1 转换成 w o r d 2 word2 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作&#xff1a; 插入一个字符删除一个字符替换一个字符 方法—动…