C的温故而知新:位操作(C Primer Plus第十五章)

第十五章:位操作

这一章的篇幅不是很长,但既然能单独作为一章来讲的话,应该蛮重要的,但是我貌似没有总结出多少需要注意、加强记忆的东西,可见在JAVA的日常开发过程中基本不太遇见有关位操作的内容,所以我也就不晓得那块属于本章的重点内容了。不过,不要紧,先挑我感觉比较重要的内容去记录一下。

首先,关于二进制与十进制,说大一点,还有八进制和十六进制,在之前都已经介绍过了,理解一下计算机只可以识别0、1就可以对这一些有关进制的内容有较好的理解。通常,一字节包含八位,C语言用字节来表示存储系统字符集所需的大小。可以从左到右给这八位分别编号为7~0。

C按位运算符

按位逻辑运算符,用于整型数据,包括char,这些操作都是针对每一个位进行,不影响左右两侧的位。

二进制反码或按位取反:~

一元运算符~把1变为0,把0变为1。该运算符不会改变原有的值,是创建了一个可以使用或赋值的值。

unsigned char val = 2;
~val;//2的二进制表示为00000010,那么~val的值为11111101,也就是253
unsigned char newval = ~val;

按位与:&

二元运算符,逐位比较两个运算对象,生成一个新值,对于每个位,只有两个运算对象中相应的位都为1时,结果才为1,。还有一个按位与和赋值结合的运算符: &=。

按位或:|

二元运算符,逐位比较两个运算对象,生成一个新值,对于每个位,只有两个运算对象中相应的位为1时,也就是两个位中有一个为1,结果就为1,。还有一个按位或和赋值结合的运算符: |=。

按位异或:^

二元运算符,逐位比较两个运算对象,生成一个新值,对于每个位,如果两个运算对象中相应的位为1(但不是两个为1),结果为1(也就是一真一假)。还有一个按位异或和赋值结合的运算符: ^=。

常用用法

掩码:按位与运算常用于掩码,掩码中的1表示透明,0表示不透明。使用掩码之后,会将不透明的位掩掉,因为按位与操作只要有0,结果就为0。也就是只显示需要的位数据。

打开位(设置位):打开一个值中的特定位,同时保持其他位不变。使用按位或运算符,将想要设置为1的位的码内容设置为1,想要保持不变的位码内容设置为0。

关闭位(清空位):不影响其他位的情况下关闭指定的位。使用按位与运算符,将想要设置为0的位的码内容设置为0,想要保持不变的位码内容设置为1。

切换位:打开已关闭的位,或关闭已打开的位。可以使用按位异或运算符切换位。将想要设置为开的位,对应码以及原码设置为1和0。

检查位的值:检查某位的值,要先覆盖其他位,以免产生影响。

if((flags & MASK) == MASK)//按位运算符的优先级比==低puts(“Wow!!”);

移位运算符

左移(<< ):左移运算符将其左侧的运算对象每一位的值向左移动其右侧的运算对象指定的位数。左侧运算对象移出左末端的值丢失,用0填充空出的位置。产生一个新的值,但是并不改变运算对象。所以与赋值运算符结合可以得到(<<=)

(10001010)<<2//得到结果(00101000)

右移(>> ):右移运算符将其左侧的运算对象每一位的值向右移动其右侧的运算对象指定的位数。左侧运算对象移出右末端的值丢失,对于无符号的类型,用0填充空出的位置;有符号类型的话,取决于机器,可用0填充,或者用符号位(最左侧位)的副本填充。产生一个新的值,但是并不改变运算对象。所以与赋值运算符结合可以得到(<<=)

(10001010)>>2//得到结果(00100010)某些系统上是(11100010)

用法:针对2的幂提供快速有效的乘法和除法。

number>>n;//如果number为非负值,则number除以2的n次幂
number<<n;//number乘以2的n次幂

位字段

操纵位的第二种方法是位字段。位字段是一个signed int或unsigned int或_Bool类型变量中的一组相邻的位。通过一个结构声明来建立,该结构为每个字段提供标签,并确定该字段的宽度。可以通过普通的结构成员运算符(.)单独为这些字段赋值。

struct{unsigned int autfd : 1;unsigned int bldfc : 1;unsigned int undkn : 2;bool flag          ; 1;
}prnt;
prnt.autfd = 0;
prnt.undkn = 3;

要确保所赋的值不超出字段可容纳的范围。可以使用未命名的字段宽度填充未命名的洞。使用一个宽度为0的未命名字段迫使下一个字段与下一个整数对齐。

对齐特性

_Alignof运算符给出一个类型的对齐要求,比如:

size d_align = _Alignof(float);

float类型的对齐值要求是d_align的值。可以使用_Alignas说明符指定一个变量或类型的对齐值。但是不应该要求该值小于基本对齐值。

在这里插入图片描述

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

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

相关文章

FSQ26信号分析仪RS FSU26 20HZ-26.5G频谱分析仪

罗德与施瓦茨Rohde & Schwarz FSQ26信号分析仪&#xff0c;20 Hz - 26.5 GHz ​R&S FSQ26 信号分析仪集两种仪器于一身。它提供高达 120 MHz 解调带宽的信号分析&#xff0c;并具有高端频谱分析仪的动态范围。 频率范围&#xff1a;20 Hz 至 26.5 GHz 高端频谱分析仪…

神经网络—卷积层

1.讲解 Conv2d out_channels 参数为2时&#xff0c;会生成两个卷积核&#xff0c;分别与输入进行卷积。得到的两个输出为输出 新生成的卷积核和原来的卷积核不一定相同 in_channels (int) – Number of channels in the input image out_channels (int) – Number of channels…

ARM32开发——(六)GPIO_USART通信原理

1. 串行通信和并行通信 1.1 串行通信 串行通信是一种数据传输的方式&#xff0c;它是指将数据按照一位一位的顺序依次发送和接收&#xff0c;常用于远距离通信、嵌入式系统和低带宽传输场景下。串行通信相对于并行通信而言&#xff0c;只需要传输一条数据线&#xff0c;相对简…

一文了解机器学习顶会ICML 2024的研究热点

对人工智能研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICML 2024的研究热点&#xff0c;帮助读者了解和跟踪机器学习和人工智能的前沿研究方向。本推文的作者是许东舟&#xff0c;审校为邱雪和黄星宇。 1 会议介绍 ICML&#x…

运放阻抗和噪声(同相放大器的输入/输出阻抗 + 电压跟随器阻抗 + 噪声 +信噪比)

2024-8-27&#xff0c;星期一&#xff0c;21:03&#xff0c;天气&#xff1a;阴雨&#xff0c;心情&#xff1a;晴。培训终于结束啦&#xff0c;开始轮岗了&#xff0c;看了两天PPT&#xff0c;加油加油&#xff0c;继续学习。 今天继续学习第六章运算放大器&#xff0c;主要学…

一文带你从零到实战,学会gcc和Makefile,多文件编译神器的使用与编写

目录&#xff1a; 目录&#xff1a; 一、什么是Makefile 1.1 makefile的作用&#xff1a; 1.2 makefile的基本组成&#xff1a; 二、Linux编译过程&#xff1a; 2.1 linux编译过程: 2.1.1 预处理&#xff08;Preprocessing&#xff09; 2.1.2 编译&#xff08;Compilation&am…

Android Studio 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 选择外观字体 前言 Android Studio 自定义字体大小&#xff0c;统一设置为 JetBrains Mono &#xff0c;大小为 14 具体操作 【File】>【Settings...】>【Appearance & Behavior】>【…

二、设置地图配置表

一、导入一个背景图 由于背景图比较大&#xff0c;需要缩小至0.73 二、写配置文件&#xff08;SO&#xff09; 使用List需要一个命名空间 写一个类&#xff0c;声明房间的出现数量和种类&#xff1b;将它实例化出来 三、枚举变量的多选 在枚举变量中标记命名空间&#xff…

docker 多线成服务,比如gunicorn服务启动报错解决办法

docker执行的时候报错&#xff0c;排查是线程创建权限不足导致的&#xff0c;报错如下。 解决办法 docker run -e OPENBLAS_NUM_THREADS1 your_image

Unity XR Interaction Toolkit 踩坑记录

1&#xff1a;按下 grap/select 键 物品直接飞到手上 2 按下 grap/select 键 物品一点点的想自己移动

OpenCV杂项图像变换(2)线性混合函数blendLinear()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 执行两个图像的线性混合&#xff1a; dst ( i , j ) weights1 ( i , j ) ∗ src1 ( i , j ) weights2 ( i , j ) ∗ src2 ( i , j ) \texttt{…

关于多线程你了解多少?

或许是执念太重&#xff0c;又或许是性格缺陷&#xff0c;我对java中一些知识的坚持&#xff0c;已经到了让人无法接受的地步。有些人甚至因此在背后骂我神经病、傻瓜。但我依旧我行我素&#xff0c;即使中间懈怠了很长时间&#xff0c;重新开始时我依旧会以这些知识为起点。不…

Ubuntu上搭建Nginx环境

1. 软件包下载 nginx下载地址 下载linux版本的nginx&#xff0c;如图圈示 2. 将下载好的软件包上传至Linux服务器 假设上传到 /opt/nginx 目录,进入目录 cd /opt/nginx解压&#xff0c;根据版本自行修改版本号 tar zxvf nginx-1.16.0.tar.gz3.安装 安装编译所需的依赖&a…

前端算法 === 力扣 111 二叉树的最小深度

目录 问题描述 DFS&#xff08;深度优先搜索&#xff09;方案 BFS&#xff08;广度优先搜索&#xff09;方案 总结 力扣&#xff08;LeetCode&#xff09;上的题目111是关于二叉树的最小深度问题。这个问题可以通过深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&…

QJson的写入和解析基本操作

一、QJson简介 QJson 是一个用于处理 JSON&#xff08;JavaScript Object Notation&#xff09;数据的 C 库 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式 JSON 的语法简洁明了&#xff0c;使用人类可读的文本格式来表示数据 它由键值…

分块矩阵的转置

证明 则 证明&#xff1a;令&#xff0c;有&#xff0c;对它做一个分块使得和后面的分块矩阵中的是同型矩阵&#xff0c;要证明&#xff08;任意的&#xff09;&#xff0c;需要证明1&#xff09;是一个的矩阵 2&#xff09;任意的 首先证明1&#xff09;我们先定义两个函…

Getting RateLimitError while implementing openai GPT with Python

题意&#xff1a;“在使用 Python 实现 OpenAI GPT 时遇到 RateLimitError 错误。” 问题背景&#xff1a; I have started to implement openai gpt model in python. I have to send a single request in which I am getting RateLimitError. “我开始在 Python 中实现 Ope…

SSH弱口令爆破服务器

一、实验背景 1、概述 使用kali的hydra进行ssh弱口令爆破&#xff0c;获得服务器的用户名和口令&#xff0c;通过 ssh远程登录服务器。 2、实验环境 kali攻击机&#xff1a;192.168.1.107 centos服务器&#xff1a;192.168.1.105 二、前置知识 1、centos设置用户并设置弱…

HR招聘,如何解决面试流程繁琐的问题

要解决面试流程繁琐的问题&#xff0c;就必须要精简和优化招聘流程。比如精简面试环节&#xff0c;制定标准化流程&#xff0c;完善信息管理&#xff0c;对面试环节进行细致梳理之后&#xff0c;尽快识别并去除那些不必要的步骤&#xff0c;这样就能够减少求职者的等待时间&…

IAR软件配置笔记

Project->Optiions->配置Device Debug中配置 C/C Compiler中配置 优化等级 C语法标准选择 回到主界面&#xff0c;Tools->Options 字体调整 Editor更改缩进数 Project->Make编译 调试模式和编辑模式的View菜单栏不一样http://t.csdnimg.cn/JsWjy Disa…