位运算(一)

news2024/11/26 18:48:33

C语言是为描述系统而设计的,因此它应当具有汇编语言所能完成的一些功能。C语言既具有高级语言的特点,又具有低级语言的功能,因而具有广泛的用途和很强的生命力。本章将介绍的位运算就很适合于编写系统软件的需要,是 C语言的重要特色。在计算机用于检测和控制领域中要用到位运算的知识。

所谓位运算是指进行二进制位的运算。在系统软件中,常要处理二进位的问题。例如,将一个存储单元中的各二进位左移或右移一位,两个数按位相加等。C语言提供位运算的功能,与其他高级语言(如PASCAL)相比,它显然具有很大的优越性。

1位运算符和位运算

C语言提供如表12.1所列出的位运算符。

说明:

  1. 位运算符中除~以外,均为二目(元)运算符,即要求两侧各有一个运算量。
  2. 运算量只能是整型或字符型的数据,不能为实型数据。

下面对各运算符分别介绍如下:

1.1 “按位与”运算符(&)

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

0&0=0,0&1=0,18.0=0,1&1=1.

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

       00000011 (3)

(&)  00000101 (5)

       00000001 (1)

因此,3&5的值得1.如果参加&.运算的是负数(如-3&-5),则以补码形式表示为二进制数,然后按位进行“与”运算。

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

(1)清零。如果想将一个单元清零,即使其全部二进位为0,只要找一个二进制数,其中各个位符合以下条件:原来的数中为1的位.新数中相应位为0.然后使二者进行&运算,即可达到清零目的。

如:原有数为00101011.另找一个数,设它为10010100,它符合以上条件,即在原数为1的位置上,它的位值均为0,将两个数进行&运算:

       00101011

(&)  10010100

       00000000

其道理是显然的。当然也可以不用10010100这个数而用其他数(如01000100)也可以.只要符合上述条件即可。

(2)取一个数中某些指定位。如有一个整数a(2个字节),想要其中的低字节,只需将:与(377),按位与即可。见图12.1。

c=a&b,b为八进制数的377,运算后c只保留a的低字节,高字节为0。

如果想取两个字节中的高字节,只需c=a&.0177400(0177400表示八进制数的177400)。见图12.2。

(3)要想将哪一位保留下来,就与一个数进行&.运算,此数在该位取1.如:有一数01010100,想把其中左面第3、4、5、7、8位保留下来,可以这样运算:

       01010100 (十进制数84)

(&)  00111011 (十进制数59)

       00010000 (十进制数16)

即a=84,b=59,c=a&b=16.

1.2 按位或运算符(|)

两个相应的二进位中只要有一个为1,该位的结果值为1.即0|0=0,0|1=1,1|0=1,1|1=1。

例如:

060|017

将八进制数 60与八进制数17进行按位或运算。

     00110000

(|)  00001111

     00111111

低4位全为1。如果想使一个数a的低4位改为1,只需将a与017进行按位或运算即可。

按位或运算常用来对一个数据的某些位定值为1。如:a是一个整数(16位),有表达式a|0377

则低8位全置为1。高8位保留原样。

1.3“异或”运算符(∧)

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

      00111001(十进制数57,八进制数071)

(∧) 00101010(十进制数42,八进制数052)

      00010011(十进制数19,八进制数023)

即071∧052,结果为023(八进制数)。

“异或”的意思是判断两个相应的位值是否为“异”,为“异”(值不同)就取真(1),否则为假(0)。

下面举例说明∧运算符的应用:

(1)使特定位翻转

假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行人运算,即

      01111010

(∧) 00001111

      01110101

结果值的低4位正好是原数低4位的翻转。要使哪几位翻转就将与其进行A运算的该几位置为1即可。这是因为原数中值为1的位与1进行人运算得0,原数中的位值0与1进行人运算的结果得1。

  1. 与0相∧,保留原值

如 012/00=012

      00001010

(∧) 00000000

      00001010

因为原数中的1与0进行人运算得1,0∧0得0,故保留原数。

(3)交换两个值,不用临时变量

假如a=3,b=4。想将a和b的值互换,可以用以下赋值语句实现:

a=a∧b;

b=b∧a;

a=a∧b;

可以用下面的竖式来说明:

     a=011

(∧) b=100

      a=111 (a∧b的结果,a已变成7)

(∧) b=100

      b=011 (b∧a的结果,b已变成3)

(∧) a=111

     a=100 (a∧b的结果,a变成4)

即等效于以下两步:

执行前两个赋值语句:“a=a∧b;”和“b=b∧a;”相当于b=b∧(a∧b).而b∧aΛ b等于aΛb∧b。b∧b的结果为0,因为同一个数与本身相人,结果必为0。因此b的值等于aΛ0,即a,其值为 3.

②再执行第三个赋值语句:a=a∧b。由于a的值等于(a∧b),b的值等于(b∧a∧ b),因此,相当于a=a∧b∧b∧a∧b,即a的值等于a∧a∧b∧b∧b,等于b。

a得到b原来的值。

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

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

相关文章

基于SpringBoot+Vue中小企业人事管理系统代码(源码+部署说明+演示视频+源码介绍)

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

Visual Studio 2013 - 高亮设置括号匹配 (方括号)

Visual Studio 2013 - 高亮设置括号匹配 [方括号] 1. 高亮设置 括号匹配 (方括号)References 1. 高亮设置 括号匹配 (方括号) 工具 -> 选项… -> 环境 -> 字体和颜色 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

Grok-1 :目前参数最大的开源大模型

在人工智能快速发展的自然语言处理领域中,xAI 正式发布了大模型 Grok-1,这是迄今参数量最大的开源大语言模型,标志着一个重要的里程碑。Grok-1 是一个拥有3140亿参数的专家混合模型,经过四个月的开发,以其创新的架构和…

2024年中国酶制剂供需布局及市场发展现状

环洋咨询Global Info Research的酶制剂市场调研报告提供酶制剂市场的基本概况,包括定义,分类,应用和产业链结构,同时还讨论发展政策和计划以及制造流程和成本结构,分析酶制剂市场的发展现状与未来市场趋势,…

阿里云99元服务器40G ESSD Entry系统盘够用吗?

阿里云99元服务器40G ESSD Entry云盘够用吗?够用,操作系统占15GB左右,还有25G富余。如果是40G ESSD Entry系统盘不够用,还可以为云服务器另外挂载数据盘,所以不用担心40G系统盘不够用。可以在阿里云CLUB中心查看 aliyu…

第1章 初识 Python 背记手册

1、print()—输出 print()函数的基本用法如下: print("输出的内容")其中,输出内容可以是数字和字符串(使用引号括起来),此类内容将直接输出,也 可 以是包含运算符的表达式,此类内容…

NSS [SWPUCTF 2022 新生赛]ez_ez_unserialize

NSS [SWPUCTF 2022 新生赛]ez_ez_unserialize 开题,直接给了题目源码。 简单看了一下,题目告诉我们flag在哪,而且类中有高亮文件方法。怎么拿flag已经很明显了。关键点在于__weakup()魔术方法固定死了我们高亮的文件。所以这题只需要绕过__w…

关于vue3的自定义hook

把一些逻辑写在单独的ts文件里,vue文件使用的时候引入即可 1、计算属性写出去 直接写出去的话,使用时报错 ExpirationTime是一个计算属性,若直接在html上使用{{ExpirationTime(orderForm报错)}} 查阅资料显示:在 setup 函数中&…

docker入门(五)—— 小练习,docker安装nginx、elasticsearch

练习 docker 安装 nginx # 搜素镜像 [rootiZbp15293q8kgzhur7n6kvZ home]# docker search nginx NAME DESCRIPTION STARS OFFICIAL nginx …

适不适合跳过六西格玛绿带直接攻读六西格玛黑带?自我评估指南

六西格玛认证体系的设计初衷是逐步引领学习者深入掌握六西格玛的理论、工具和实践应用。从白带到大师黑带,每一步都旨在为学习者提供逐渐累积的学习经验和技能提升。然而,个人背景差异巨大,有的学习者可能因为其丰富的项目管理经验、质量管理…

windows10 WSL启动Ubuntu虚拟机,安装DolphinScheduler

文章目录 1. 启动WSL与虚拟机2. 安装Docker与DolphinScheduler容器 1. 启动WSL与虚拟机 使用管理员权限运行命令: Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux重启后即可创建虚拟机 在Microsoft Store中搜索Ubuntu&…

Python计算机二级选择易错题(一)

题目来源:python计算机二级真题(选择题) - 知乎 选择题第08,09套

实操 | 从0到1教你用Python来爬取整站天气网

Scrapy Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。 一、安装scrapy 安装Twisted Twisted:为 Python 提供的基于事件驱动的网络引擎包。 在下面网址安装Twisted url:https://www.l…

【正点原子Linux连载】 第十六章 Linux阻塞和非阻塞IO实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id731866264428 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第十六…

三种简单方法教你手机mp4怎么转换成mp3!

在日常生活中,我们经常会遇到想要将手机上的MP4视频转换为MP3音频的情况。可能是想要提取音频内容,例如歌曲或录音,方便在其他设备上播放或分享;也可能是为了节省手机存储空间,将视频文件转换为更小的音频文件。 无论…

基础知识(读取指定数据/布尔索引/nan/inf)

读取数据 代码 import numpy as np# 文件的路径 us_file_path"./youtube_video_data/US_video_data_numbers.csv" uk_file_path"./youtube_video_data/GB_video_data_numbers.csv"# 读取文件 t1np.loadtxt(us_file_path,delimiter,,dtypeint) t2np.loadt…

VBA之Word应用:利用Bookmark属性返回选择区域的开始和结束位置

《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…

文件包含漏洞之包含SESSION(CTF题目)

这次使用的环境是ubuntunginxphpmysql 首先四个文件源码在以下链接中: 一道CTF题:PHP文件包含 | Chybeta 我们注册一个用户名111密码111,然后登录查看cookie和linux的session,因为我们的de服务器 是手动搭建的,所以…

一款不错的开源的 Linux 服务器运维管理面板:1Panel

适用于非运维人员的环境搭建、部署、监控等 一、1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定; 高效管理&#xf…

C语言易错知识点

1、数组长度及所占字节数 char x[] {"Hello"},y[]{H,e,l,l,o}; x数组的长度为5&#xff0c;y的长度也是5 x、y数组所占字符串为6为 51(\0)6 strlen&#xff08;&#xff09;函数得到的是数组的长度 2、%%与%的优先级 #include<stdio.h> int main(){ int a…