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

C语言之位运算

一、什么是位运算

所谓位运算是指进行二进制位的运算
在系统软件中,常要处理二进位的问题
例如,将一个存储单元中的各二进位左移或右移一位,两个数按位相加等

二、位运算符和位运算

1、按位与 运算符(&)

参加运算的两个数据,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0

即0&0=0;0&1=0;1&0=0;&1=1;

例如: 3&5 并不等于8,应该是按位与。

在这里插入图片描述
如果参加&运算的是负数(如-3 & -5),则以补码形式表示为二进制数,然后按位进行“与”运算

按位与有一些特殊的用途:

  • 清零
  • 取一个数中某些指定位

实例:

#include <stdio.h>int main(int argc, char *argv[])
{int num1 = 3;int num2 = 5;int res = num1 & num2;printf("res = %d\n", res);return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 1

负数在内存中是使用的补码表示的
负数的补码表示规则:最高位表示符号(0表示正数,1表示负数),数据值采用反码加1来表示
一个负数在内存中的表示:先看符号位,如果符号位负,最高位就为1,对于数据值,将负数的绝对值取反用二进制表示,在此基础上加1,就是负数的补码表示
-1在内存中存储的时候存储的是1111…11(32个1)

#include <stdio.h>int main(int argc, char *argv[])
{int num1 = -1;int num2 = -3;int res = num1 & num2;printf("res = %d\n", res);return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = -3

2、按位或运算符(|)

两个相应的二进位中只要有一个为1,该位的结果值为1

0|0=0; 0|1=1; 1|0=1; 1|1=1。

例如:060|017
将八进制数60与八进制数17进行按位或运算。
在这里插入图片描述
实例:

#include <stdio.h>int main(int argc, char *argv[])
{int num1 = 3;int num2 = 5;int res = num1 | num2;   //011 | 101 == 111  == 7printf("res = %d\n", res);printf("num1 = %x\n", num1);return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 7
num1 = 3

3、“异或”运算符(∧)

异或运算符∧也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)

0∧0=0; 0∧1=1; 1∧0=1; 1∧1=0;

如:
在这里插入图片描述
下面举例说明∧运算符的应用:

  • 使特定位翻转
    假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行∧运算,即
    在这里插入图片描述

  • 与0相∧,保留原值
    如: 012∧00=012
    在这里插入图片描述
    因为原数中的1与0进行∧运算得1,0∧0得0,故保留原数。

  • 交换两个值,不用临时变量
    假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:

a=a∧b;
b=b∧a;
a=a∧b;

4、“取反”运算符(~)

~是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变1,1变0。
例如~025是对八进制数25(即二进制数00010101)按位求反。

5、左移运算符(<<)

用来将一个数的各二进位全部左移若干位。例如

a=a<<2

将a的二进制数左移2位,右补0。
若a=15,即二进制数00001111,左移2位得00111100,即十进制数60。
高位左移后溢出,舍弃不起作用。
左移1位相当于该数乘以2,左移2位相当于该数乘以22=4。。
但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。
左移比乘法运算快得多,有些C编译程序自动将乘2的运算用左移一位来实现,将乘2n的幂运算处理为左移n位

实例:

#include <stdio.h>int main(int argc, char *argv[])
{int num1 = 3;int num2 = 5;int res = num1 | num2;   //011 | 101 == 111  == 7res = num1 << 3;printf("res = %d\n", res);printf("num1 = %x\n", num1);res = num2 >> 2;  //101 >>2 printf("res = %d\n", res);num2 = -23;   //10111-->11...01001res = num2 >> 3;   //11...01001>>3  --> 111...01  --> -3printf("res = %d\n", res);num2 =0x83fffff3;res = num2 << 3;printf("res = %d\n", res);return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 24
num1 = 3
res = 1
res = -3
res = 536870808   //说明左移的时候符号位是会丢弃的

6、右移运算符(>>)

a>>2表示将a的各二进位右移2位
移到右端的低位被舍弃,对无符号数,高位补0

右移一位相当于除以2,右移n位相当于除以2n。
在右移时,需要注意符号位问题。
对无符号数,右移时左边高位移入0。
对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0
如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的移入1。移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”

实例:

#include <stdio.h>int main(int argc, char *argv[])
{int num1 = 3;int num2 = 5;int res = num1 | num2;   //011 | 101 == 111  == 7res = num1 << 3;printf("res = %d\n", res);printf("num1 = %x\n", num1);res = num2 >> 2;  //101 >>2 printf("res = %d\n", res);num2 = -23;   //10111-->11...01001res = num2 >> 3;   //11...01001>>3  --> 111...01  --> -3printf("res = %d\n", res);return 0;
}
[root@localhost 10_bits]# gcc test1.c -o test1
[root@localhost 10_bits]# ./test1
res = 24
num1 = 3
res = 1
res = -3

7、位运算赋值运算符

位运算符与赋值运算符可以组成复合赋值运算符如:&=, |=, >>=, <<=, ∧=
例如,a & = b相当于 a = a & b
a << =2相当于:a = a << 2

8、不同长度的数据进行位运算

如果两个数据长度不同(例如long型和int型)进行位运算时(如a & b,而a为long型,b为int型),系统会将二者按右端对齐
如果b为正数,则左侧16位补满0
若b为负数,左端应补满1
如果b为无符号整数型,则左侧添满0

相关文章:

C语言之位运算

一、什么是位运算 所谓位运算是指进行二进制位的运算 在系统软件中&#xff0c;常要处理二进位的问题 例如&#xff0c;将一个存储单元中的各二进位左移或右移一位&#xff0c;两个数按位相加等 二、位运算符和位运算 1、按位与 运算符(&) 参加运算的两个数据&#xff…...

c语言进阶部分详解(数据在内存中的存储)

大家好&#xff0c;今天要进行梳理的内容是数据在内存中的存储相关内容。 在C语言中&#xff0c;数据在内存中的存储是一个非常重要的概念。了解数据在内存中的存储方式可以帮助我们更好地理解程序的执行过程&#xff0c;优化内存使用&#xff0c;提高程序的性能。 目录 一.数…...

VIOOVI的ECRS工时分析软件分析:SOP的核心和特征是什么?

制定SOP的主要目的是为企业做技术储备、提供企业的工作效率、防止同样的错误反复出现、让员工作业有标准化的行为准则。以规定的成本、规定的工作时间&#xff0c;生产质量均匀、符合规范的产品。为了能够达到上述要求&#xff0c;如果制造现场的操作混乱&#xff0c;比如制作工…...

无涯教程-Perl - lock函数

描述 此函数将咨询锁放在共享变量或THING中包含的引用对象上,直到该锁超出范围。 lock()是一个"弱关键字":这意味着,如果您在调用该函数之前已通过该名称定义了该函数,则将改为调用该函数。 语法 以下是此函数的简单语法- lock THING返回值 此函数不返回任何值…...

SpringBoot案例-部门管理-前后端联调

前后端联调 教学资料中提供了“前端工程”&#xff0c;将其解压即可使用nginx&#xff0c;启动nginx后&#xff0c;访问&#xff1a;http://localhost:90 小结 开发流程 明确需求、阅读接口文档、思路分析、接口开发&#xff08;遵循接口文档&#xff09;接口调试 postman测…...

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …...

【C++】友元(含内部类)

一、友元是什么 我把你添加为我的友元&#xff0c;那么你可以访问我的成员。特别注意&#xff1a;它是单向的。即&#xff0c;我把你添加为我的友元&#xff0c;我却不能访问你的成员&#xff0c;除非你把我添加为你的友元。 以下代码可以让你粗略了解友元的使用。 #includ…...

SQL | 检索数据

1-检索数据 1.1-检索单个列 SELECT prod_name FROM Products; 上述SELECT语句从Products表中检索一个名为prod_name的列。 所要查找的列在select后面&#xff0c;from关键字指出从那个表查询数据。 输出如下&#xff1a; prod_name8 inch teddy bear12 inch teddy bear18…...

typeScript 之 运算符

工具&#xff1a; PlayGround 算术运算符 运算符描述加-减*乘/除%取模(求余)自增–自减 注意和--&#xff0c;实例&#xff1a; let value 0; console.log(value); //0, 先显示再增加后为1 console.log(value); //2&#xff0c;先增加后为2再显示关系运算符 运算符描述 …...

BGP实验

题目 IP地址配置 172.16.X.0/24为模拟用户环回接口接口 172.16.7.X/32为BGP邻居关系建立的环回接口 R1&#xff1a; R2&#xff1a; R3&#xff1a; R4&#xff1a; R5&#xff1a; R6&#xff1a; R7&#xff1a; R8&#xff1a; BGP邻居关系建立、宣告和反射器、联邦配置 R…...

pytest fixture 常用参数

fixture 常用的参数 参数一&#xff1a;autouse&#xff0c;作用&#xff1a;自动运行&#xff0c;无需调用 举例一&#xff1a;我们在类中定义一个function 范围的fixture; 设置它自动执行autouseTrue&#xff0c;那么我们看下它执行结果 输出&#xff1a; 说明&#xff1a;…...

vue项目里面有多个模块的服务,前端处理url转发

先看下vue的代理配置里面&#xff1a; 现在是在 /pca 基础上增加了 2个模块的服务&#xff1a; /dca、 /api 现在服务器的nginx 没有在/pca 服务里面做转发接受 /dca、 /api的服务&#xff0c;所以需要前端自己去配置每个服务模块对应的 URL 先拿登录的api 做示例吧: 先定义…...

web表单

在了解了 Flask Bootstrap 基本框架之后&#xff0c;我们来了解一下 Flask 框架的 表单( form )&#xff0c;以帮助我们创建交互式的 Web 应用&#xff0c;最后会有个提交个人信息的例子。 Flask-WTF 是 Flask 框架的一个扩展&#xff0c;用来做表单的交互&#xff0c;是对 WT…...

C++BUG记录:文件无法创建,文件路径正确但使用了Format

问题1&#xff1a;xx.Format()不存在与参数列表匹配的重载函数 问题&#xff1a;文件的路径名字是通过Format转换组合而成的&#xff0c;会报错“FileName.Format()不存在与参数列表匹配的重载函数”。 FileName.Format("%s%d", FilePath, num);//报错&#xff1a;…...

nodejs框架 express koa介绍以及从零搭建 koa 模板

express 下载 npm install express搭建服务 const express require("express");const app express();app.get("/home", (req, res) > {res.send("home"); });app.listen(3000, () > {console.log("http://127.0.0.1:3000")…...

84 | Python可视化篇 —— Pyecharts数据可视化

文章目录 1. 简介安装和环境设置2. 基本图表类型折线图(Line Chart)散点图(Scatter Plot)柱状图(Bar Chart)饼图(Pie Chart)地理地图(Geo Map)3. 数据处理和图表配置4. 高级图表类型5. 自定义选项和交互性6. 数据可视化和动态图7. 组合图表和多子图1. 简介 Pyechart…...

【Nginx】Nginx负载均衡

负载均衡&#xff1a;通过反向代理来实现 Nginx的七层代理和四层代理&#xff1a; 七层是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模块当中 &#xff1b;配置的方法名称为&#xff1a;upstream模块&#xff0c;不能写在server中也不能写在location中&a…...

vue3报错

这是因为eslint对代码的要求严格导致的&#xff0c;可以在package.json里面删掉"eslint:recommended"&#xff0c;然后重启就可以正常运行了...

每日一学——IP地址和子网掩码

IP地址和子网掩码是网络中非常重要的概念。IP地址是用于标识和寻址网络中设备&#xff08;如计算机、手机等&#xff09;的唯一标识符。而子网掩码则用于划分网络中的子网。 IP地址是一个由32位二进制数组成的地址&#xff0c;通常以点分十进制的形式表示&#xff0c;如192.16…...

【redis 3.2 集群】

目录 一、Redis主从复制 1.概念 2.作用 2.1 数据冗余 2.2 故障恢复 2.3 负载均衡 2.4 高可用 3.缺点 4.流程 4.1 第一步 4.2 第二步 4.3 第三步 4.4 第四步 5.搭建 5.1 主 5.2 从 6.验证 二、Reids哨兵模式 1.概念 2.作用 2.1 监控 2.2 自动故障转移 2.…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么&#xff1f;1.1.2 感知机的工作原理 1.2 感知机的简单应用&#xff1a;基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...