解决LeetCode编译器报错的技巧:正确处理位操作中的数据类型

一天我在leetcode上刷题时,遇到了这样的题目:

随即我写了如下的代码:

int convertInteger(int A, int B) {int count = 0;int C = A ^ B;int flag = 1;while(flag){if (C & flag){count++;}flag<<=1;}return count;}

但LeetCode显示如下报错:

 我非常的纳闷,不知道哪里出了错误,我又去VS2022这个编译器上把上述代码试了一遍,发现没有任何报错,这时我就想明白了应该是LeetCode和VS2022这两个编译器的不同导致的。

我去网上搜查资料结果表明只需要将变量flag的类型改为无符号类型即可。

改动后的代码如下:

写法一:

int convertInteger(int A, int B) {int count = 0;int C = A ^ B;unsigned int flag = 1;while(flag){if (C & flag){count++;}flag<<=1;}return count;}

在上述代码中,变量flag的类型必须设为unsigned int,是因为在循环中对flag进行左移操作(flag <<= 1)。根据C语言的规则,当对有符号整数进行左移操作时,如果左移操作导致最高位被设置为1,则结果是未定义的行为。这是因为有符号整数使用最高位来表示正负号,而不同的编译器可能对此有不同的处理方式。

因此,为了避免这种未定义行为,我们将flag的类型设置为unsigned int,这样在进行左移操作时,最高位就不再表示正负号,而只是普通的位操作。这样可以确保代码的行为在不同的编译器下都是一致的,并且不会受到符号位的影响。

写法二:

int convertInteger(int A, int B) {int count = 0;int C = A ^ B;for(int i=0;i<32;i++){if (C & ((unsigned int)1<<i)){count++;}}return count;
}

将左操作数1改为unsigned int 类型,原理与写法一的原理一样。


右移和左移是否一样呢?

当对有符号整数进行右移操作时,C语言规定对于正数右移,空出的位应该用0填充;而对于负数右移,空出的位应该用符号位填充。因此,如果使用有符号整数进行右移操作,并且右移导致符号位发生变化,可能会导致不同编译器之间的行为不一致。

通过将类型设置为unsigned int,可以确保在右移操作时,不受符号位的影响,从而避免潜在的问题,保证代码的可移植性和一致性。

因此,无论是左移还是右移操作,使用unsigned int 类型来表示标志位通常是一个比较安全和可靠的选择,保证代码在不同编译器之间的可移植性


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

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

相关文章

07-k8s中secret资源02-玩转secret

一、回顾secret资源的简单实用 第一步&#xff1a;将想要的数据信息【key&#xff1a;value】中的value值&#xff0c;使用base64编码后&#xff0c;写入secret资源清单中&#xff1b; 第二步&#xff1a;创建secret资源&#xff1b; 第三步&#xff1a;pod资源引用secret资源&…

建造者模式-Builder Pattern

原文地址:https://jaune162.blog/design-pattern/builder-pattern/ 引言 现在一般大型的业务系统中的消息通知的形式都会有多种,比如短信、站内信、钉钉通知、邮箱等形式。虽然信息内容相同,但是展现形式缺不同。如短信使用的是纯文本的形式,钉钉使用的一般是Markdown的形…

【研究生复试】计算机软件工程人工智能研究生复试——资料整理(速记版)——JAVA

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 1. Java 1. 和 equals的区别 比较基本数据类型是比较的值&#xff0c;引用数据类型是比较两个是不是同一个对象&#xff0c;也就是引用是否指向同 一个对象&…

C#,计算几何,贝塞耳插值(Bessel‘s interpolation)的算法与源代码

Friedrich Wilhelm Bessel 1 贝塞耳插值&#xff08;Bessels interpolation&#xff09; 首先要区别于另外一个读音接近的插值算法&#xff1a;贝塞尔插值&#xff08;Bzier&#xff09;。 &#xff08;1&#xff09;读音接近&#xff0c;但不是一个人&#xff1b; &#x…

【二十一】【C++】模版特化

模版的参数 类型模板参数 类型模板参数允许在定义模板时指定一个占位符&#xff0c;这个占位符在模板实例化时将被具体的类型替换。这使得我们能够编写与类型无关的通用代码。例如&#xff0c;标准库中的 std::vector<T> 使用一个类型模板参数 T&#xff0c;这意味着你…

transformer-Attention is All You Need(一)

1. 为什么需要transformer 循环模型通常沿输入和输出序列的符号位置进行因子计算。通过在计算期间将位置与步骤对齐&#xff0c;它们根据前一步的隐藏状态和输入产生位置的隐藏状态序列。这种固有的顺序特性阻止了训练样本内的并行化&#xff0c;这在较长的序列长度上变得至关重…

透光卓越,光耦继电器的独特特点全面解析

光耦继电器作为电子控制系统中的核心元件&#xff0c;其光电隔离技术为其独特之处。通过光电隔离技术&#xff0c;光耦继电器实现了输入和输出之间的电气隔离&#xff0c;有效阻止了高电压与低电压之间的直接接触。这项技术不仅提高了系统的安全性&#xff0c;还有效减少了电气…

【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目

C F 786 B − L e g a c y \mathrm{CF786B - Legacy} CF786B−Legacy D e s c r i p t i o n \mathrm{Description} Description 给定 1 1 1 张 n n n 个点的有向图&#xff0c;初始没有边&#xff0c;接下来有 q q q 次操作&#xff0c;形式如下&#xff1a; 1 u v w 表示…

计算机网络之网络安全

文章目录 1. 网络安全概述1.1 安全威胁1.1.1 被动攻击1.1.2 主动攻击 1.2 安全服务 2. 密码学与保密性2.1 密码学相关基本概念2.2 对称密钥密码体制2.2.1 DES的加密方法2.2.2.三重DES 2.3 公钥密码体制 3. 报文完整性与鉴别3.1 报文摘要和报文鉴别码3.1.1 报文摘要和报文鉴别码…

360可视门铃双摄版恢复案例

家用的智能摄像头恢复了很多&#xff0c;但是可视门铃的恢复却是第一次&#xff0c;现代社会似乎已经全方位处于监控网络之下。360的产品很多&#xff0c;可视门铃只是其众多品牌中的一个&#xff0c;这个案例能让我们窥视到360的开发小精产品的理念。 故障存储: 64G TF卡/ex…

Unity 2D Spine 外发光实现思路

Unity 2D Spine 外发光实现思路 前言 对于3D骨骼&#xff0c;要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼&#xff0c;各顶点的法线没有向3D骨骼那样拥有垂直于面的特性&#xff0c;那我们如何做2D骨骼的外发光效果呢&#xff1f; 理论基础 我们要知道&a…

optee CA/TA flow

以 TEEC_InvokeCommand 为例 CA—normal world EL0 //imx-optee-client\libteec\src\tee_client_api.c TEEC_InvokeCommandioctl(session->ctx->fd, TEE_IOC_INVOKE, &buf_data)通过syscall陷入内核态driver linux driver—normal world EL1 tee_ioctl // drive…