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

解决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.lryc.cn/news/300828.html

相关文章:

  • 一周学会Django5 Python Web开发-Django5操作命令
  • 反转链表【基础算法精讲 06】
  • Git 初学
  • 智胜未来,新时代IT技术人风口攻略-第四版(弃稿)
  • 渗透专用虚拟机(公开版)
  • HCIA-HarmonyOS设备开发认证V2.0-3.2.轻量系统内核基础-时间管理
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第五天-ARM Linux编程之file_operations详解 (物联技术666)
  • 第9章 网络编程
  • Python setattr函数
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • 探索弗洛姆的思想:人类本质与爱的哲学
  • 【碎片知识点】安装Linux系统 VMware与kali
  • Android 车载应用开发之SystemUI 详解
  • C# CAD-Xdata数据 添加(一)
  • 【NLP】MHA、MQA、GQA机制的区别
  • nginx upstream server主动健康监测模块添加https检测功能
  • OCP的operator——(4)用户任务:使用Operator创建etcd集群
  • win7自带截图工具保存失效解决办法
  • Android14之Android Rust模块编译语法(一百八十七)
  • 分布式文件系统 SpringBoot+FastDFS+Vue.js【三】
  • 【深度学习每日小知识】全景分割
  • 机器人能否返回原点
  • Mysql5.6忘记密码,如何找回(windows)
  • 算法训练营day29, 贪心算法3
  • 164基于matlab的奇异值分解、小波降噪、zoom细化
  • 每日OJ题_算法_递归③力扣206. 反转链表
  • 【Linux】指令 【whereis】
  • 牛客网SQL进阶128:未完成试卷数大于1的有效用户
  • GitHub的使用操作
  • 智慧公厕管理软件