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

news2024/11/15 10:12:08

第十五章:位操作

这一章的篇幅不是很长,但既然能单独作为一章来讲的话,应该蛮重要的,但是我貌似没有总结出多少需要注意、加强记忆的东西,可见在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.coloradmin.cn/o/2079798.html

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

相关文章

一起学Java(9)-[日志篇]教你掌握Java日志框架的演进和设计逻辑

在项目开发中&#xff0c;日志记录&#xff08;Logging&#xff09;扮演着至关重要的角色。日志是开发人员 调试代码和诊断问题的重要工具。例如&#xff1a;在生产环境中&#xff0c;开发人员通常无法直接调试代码&#xff0c;日志提供了一个详细的执行轨迹&#xff0c;帮助开…

一篇初学者入门Python文件的读取与写入

我们探讨了如何使用第三方库来扩展我们的Python程序能力.在这一篇教程中,我们将聚焦于Python中文件的读取与写入操作.文件操作是编程中重要的基础,能够有效地帮助我们保存和读取数据。 如果你对Python感兴趣的话&#xff0c;可以试试我整理的这一份全套的Python学习资料&#x…

建筑项目管理软件市场新风向,10款热门软件解析

1、PingCode PingCode 是一款为研发团队设计的全流程管理软件&#xff0c;连续多年入选中国软件项目管理软件榜单前二&#xff0c;是国内研发管理的热门系统。知名客户包括小红书、长城汽车、清华大学、中国电信等。 主要功能 PingCode 核心能力在于支持软件产品研发全生命周…

比requests还好用的Python高效库,效率提升一倍

Python开发者们最常用的库之一就是requests&#xff0c;它以简单易用的API和强大的功能深受喜爱。然而&#xff0c;随着爬取任务的复杂性增加&#xff0c;requests的局限性逐渐显现。一些更为高效、功能更强大的爬虫库开始进入开发者的视野 那么&#xff0c;有没有比requests更…

西北农林科技大学李毅研究员等人在农学顶刊Agric. Syst.发文:持续的干旱威胁着小麦和玉米生产,并将在未来扩大作物产量差

文章简介 论文名称&#xff1a;Concurrent drought threatens wheat and maize production and will widen crop yield gaps in the future &#xff08;持续的干旱威胁着小麦和玉米生产&#xff0c;并将在未来扩大作物产量差&#xff09; 第一作者及单位&#xff1a;Miaolei …

【EMC专题】以太网电路为什么在变压器次级侧加浪涌保护二极管?

以太网广泛应用于工业领域,会受到诸多恶劣条件的影响。一种特别恶劣的条件是 IEC61000-4-5 中强调的瞬态浪涌。浪涌瞬变对这些系统特别危险,因为这代表有较大功率耦合到以太网物理层的发送和接收电路,可能会损坏以太网控制器或 PHY。 以太网物理层包括以太网 PHY(或控制器)…

vue 实现简单AI聊天程序(一) elementui 聊天框编写

这个系列的目标是开发一个AI聊天前端界面后端问答程序&#xff0c; 探索前端界面开发。 尝试后端对接阿里云千问大模型&#xff0c;后续还会更新自己部署的大模型。 这一期用elmentui来开发一个聊天框的前端&#xff0c;根据用户发送的内容&#xff0c;AI会返回一个一模一样的…

中山大学和联想研究院提出文本到服装生成模型GarmentAligner,解决服装生成中语义对齐、数量、位置和相互关系等问题。

中山大学和联想研究院提出一个能够根据文字描述生成服装图像的智能工具GarmentAligner。它可以从已有服装图像中提取出各个组成部分&#xff0c;并记录下它们的位置和数量。接着根据你的描述进行匹配&#xff0c;找出最吻合的服装组件进行组合。而为了确保生成的图像能够准确反…

Nosql数据库redis集群配置详解

一、Redis的安装 环境介绍&#xff1a; 一主双从&#xff1a;10&#xff08;redis-node1&#xff09;主&#xff0c;20&#xff08;redis-node2&#xff09; 30&#xff08;redis-node3&#xff09;从——使用的是红帽9.1系统 源码安装redis [rootredis-node1 ~]# tar zxf red…

【yarn publish : 报错 passed folder/tarball doesn‘t exist 】

当执行yarn publish 时报错&#xff0c;具体命令类似 yarn publish --new-version ${NEW_VERSION} ${my-node-moudle-path}/my-node-modules 报错内容&#xff0c; 网上搜了一圈&#xff0c;基本没有这个报错的相关内容&#xff0c;最后分析并解决了&#xff0c;这里记录分享下…

NoSql数据库 - Redis Cluster集群详解及案例实现

Redis Cluster集群&#xff08;无中心化设计&#xff09; 1.1 Redis Cluster 工作原理 在哨兵sentinel机制中&#xff0c;可以解决redis高可用问题&#xff0c;即当master故障后可以自动将slave提升为master&#xff0c;从而可以保证redis服务的正常使用&#xff0c;但是无法…

查看exe文件所需要依赖库的方法

Windows 1.dumpbin /dependendsv [file_path]; 2.Qt windeployqt.exe打包 在exe的同一目录下生成需要的文件和库&#xff1b;如果不是qt程序结果如下&#xff1a;

发那科机床设备数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用IEC61850协议转发数据 5 6 网关使用多个逻辑设备和逻辑节点的方法 7 7 案例总结 8 1 案例说明 设置网关采集发那科机床数据把采集的数据转成IEC61850协议转发给其他系统。 2 VFBOX网关…

Google Search Console:完整教程

Google 提供了各种工具来收集和分析网站数据&#xff0c;其中最有价值的工具之一是 Google Search Console &#xff08;GSC&#xff09;。前身为 Google Webmaster Tools&#xff0c;它为 SEO 提供了对网站性能的宝贵见解。自 2015 年推出以来&#xff0c;该平台取得了长足的发…

分库分表学习笔记(一)

图源&#xff08;鹅厂技术架构师公众号&#xff09; MySQL执行顺序&#xff1a; FROM&#xff1a;确定数据来源。JOIN&#xff1a;执行表之间的连接操作。WHERE&#xff1a;过滤记录。GROUP BY&#xff1a;对记录进行分组。HAVING&#xff1a;对分组结果进行过滤。SELECT&#…

如何用Java SpringBoot+Vue搭建美容美发管理系统?实战解析

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

47.【C语言】指针(重难点)(J)

目录 26.自制排序函数(★★) *分析 *代码 往期推荐 26.自制排序函数 *分析 之前在42.【C语言】冒泡排序写过一个排序函数&#xff0c;可以将此自制一个类似qsort的函数 画圈的地方是需要修改的 #include <stddef.h> void bubble_sort(void* base, size_t num,size_t w…

Mac Cocos2d-x工程通过xcode编译时,提示无法找到SDK的解决办法

经过对整个macOS的升级&#xff0c;发现原来的Cocos2d-x4.0可编译的工程&#xff0c;无法运行。 Xcode错误提示 mac cocos2d-x 4 Showing All Messages unable to find sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.…

2024年不可错过的7款最佳UI和UX设计工具推荐

在数字产品的成功中&#xff0c;用户界面 (UI) 和用户体验 (UX) 都起着至关重要的作用。UI 和 UX 是网页设计中相互补充的两个重要方面。UI 主要关注用户界面的设计&#xff0c;而 UX 则涵盖用户与产品或服务互动时的整体体验。在本文中&#xff0c;我们将深入探讨 UX 和 UI 的…

vc矩阵计算(转置,点乘,逆矩阵)

vc计算矩阵的转置,矩阵的点乘,矩阵的逆矩阵,参考网上的例子 矩阵点乘的例子: 矩阵逆矩阵计算例子: #include "stdafx.h" #include <math.h> //#include<complex.h> #include <iostream> #include <complex> #include <cstdli…