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

C/C++移位运算问题

目录

上期答案揭晓:

回忆:

问题1展现:

问题2展现:

改进方案:

下期预告:C语言类型转换的问题。


上期答案揭晓:

上期的问题大家是否都有了想法,下面说说我的思路。

上次我们提到如果是字符数组做函数的参数,那么函数将会发生什么变化。那个问题的关键就是求数组的长度(因为数组在函数参数中会退化成为指针导致数组长度变化从而发生错误),转化一下就是字符数组如何求长度的问题。还记得我们这个系列的第一节我们提到过的字符数组的结尾会有\0作为终止符,所以我们只需要做一个循环就可以算出字符数组的长度,然后将长度作为函数参数带入函数就可以完成。 请看代码:

#include <iostream>
using namespace std;
size_t getStringLength(const char* str) 
{size_t length = 0;while (str[length] != '\0') 
{length++;}return length;
}int main() 
{const char* myString = "Hello, World!";std::cout << "The length of the string is: " << getStringLength(myString) << std::endl;return 0;
}

 因为数组退化成指针,所以函数参数那里直接写指针也是没有问题的。

C语言数组退化问题和改进


这篇文章我们来看一下移位运算的问题。不知道大家是否还记得我们之前了解过的位运算符。位运算符就是与位相关的运算符,下面就让我们看一看今天的问题吧。C++运算符表达式和基本语句——逻辑运算符和位运算符

回忆:

位运算符包括按位或,按位与,按位异或,按位取反,左移右移运算符。

今天的问题实际上我们在说位运算符的那一章就出现过端倪,接下来就让我们看一看问题所在。


问题1展现:

逻辑右移还是算术右移(左移是相同的)

这个问题我们之前讨论过,关于是那种方式,与编译器有关,但是我们还是要看看具体的表现,然后避免这种模棱两可的方式,使我们的代码可以跨平台运行。

#include <iostream>
using namespace std;
int main()
{
char a1=0x63;//0110 0011
a1=(a1<<4);
printf("0x%x\n",a1);//0011 0000char a1=0x63;//0110 0011
a1=(a1>>4);
printf("0x%x\n",a1);//0000 0110逻辑右移char a2=0x95;//1001 0101
a1=(a2<<4);
printf("0x%x\n",a2);//0101 0000char a2=0x95;//1001 0101
a1=(a2>>4);
printf("0x%x\n",a2);//1111 1001算术右移return 0;
}

我们可以看到左移的时候不会发生特殊情况,但当我们右移的时候就会出现两种情况,就会出现特殊情况。逻辑右移是因为0110 0011右移四位后0110是会保留下来的且开头是0,所以补位的也是0。算术右移是因为1001 0101右移四位后1001保留下来但是开头是1,所以补位也是1。

那么如何避免这种模棱两可的方法呢?官方给出的答案是将有符号的数变成无符号的数那么所有的右移就会变成逻辑右移(补零的方案),从而达到可移植性。

#include <iostream>
using namespace std;
int main()
{
char a1=0x63;//0110 0011
a1=(a1<<4);
printf("0x%x\n",a1);//0011 0000char a1=0x63;//0110 0011
a1=(a1>>4);
printf("0x%x\n",a1);//0000 0110逻辑右移unsigned char a3=0x95;//1001 0101
a1=(a3<<4);
printf("0x%x\n",a3);//0101 0000unsigned char a3=0x95;//1001 0101
a1=(a3>>4);
printf("0x%x\n",a3);//0000 1001 逻辑右移return 0;
}

只需要加上unsigned就可以将有符号的数改成无符号的数,那么就可以统一成为逻辑右移(补0)。


问题2展现:

移位操作位数的限制

#include <iostream>
using namespace std;
int main()
{
const unsigned char priv=0xff;
const unsigned char P_BACKUP=(1<<7);
const unsigned char P_ADMIN=(1<<8);
if(priv & P_BACKUP)
{
cout<<"BACKUP"<<endl;
}
if(priv & P_ADMIN)
{
cout<<"ADMIN"<<endl;
}
return 0;
}

我们预测一下上面的结果会输出什么。答案是BACKUP。这个问题十分的明显,那就是我们在移位的过程中导致移位超过了char型变量的长度(8位),从而引发错误。所以我们在开始移位的时候就会发现错误,我们应该这样改    const unsigned char P_BACKUP=(1<<6);
const unsigned char P_ADMIN=(1<<7);这样结果就会显示BACKUP;ADMIN,两个答案。


改进方案:

其实这类的改进我们只需要记住char型的长度是8,int型一般为32,记清楚每个类型的变量存储的大小那么就不会出现上述的错误。如果移位超过了存储长度,那么其实就相当于删除,因为超出长度的那部分没有意义。

当然C++也是给出了改进方案,比如我们不知道这个类型的存储长度,那么我们就用<bitset>的方法来定义一个长度,比如我们忘记了char是八个字符,那么我们就自定义一个长度比如说10,那么我们就不会导致移位过程中超出存储长度而发生错误。

#include <iostream>
#include <bitset>
using namespace std;
int main()
{
bitset<10> priv=0xff;
bitset<10> P_BACKUP=(1<<6);
bitset<10> P_ADMIN=(1<<7);
if(priv & P_BACKUP)
{
cout<<"BACKUP"<<endl;
}
if(priv & P_ADMIN)
{
cout<<"ADMIN"<<endl;
}
return 0;
}

看代码中的自定义长度就可以避免我们的移位超出存储长度,这就是C++的解决方案,也是很简单的,但是我认为还是要记清楚各个类型的存储长度。

🆗到这里,这篇关于C语言移位运算的陷阱就说完了,求一个免费的赞,感谢阅读

下期预告:C语言类型转换的问题。

相关文章:

C/C++移位运算问题

目录 上期答案揭晓&#xff1a; 回忆&#xff1a; 问题1展现&#xff1a; 问题2展现&#xff1a; 改进方案&#xff1a; 下期预告&#xff1a;C语言类型转换的问题。 上期答案揭晓&#xff1a; 上期的问题大家是否都有了想法&#xff0c;下面说说我的思路。 上次我们提到…...

录屏工具 Icecream Screen Recorder PRO v7.41

Icecream Screen Recorder的免费屏幕录制工具&#xff0c;具备捕捉视频、音频、图片和游戏等多种功能。以前推荐过的icecreamPDF也是他家的非常好用&#xff01; 下载链接&#xff1a;「录屏」来自UC网盘分享https://drive.uc.cn/s/b474616b91534...

解决连接不上Linux和服务器中的Nacos(Windows中能连接但是Linux中却不行)

报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNKNOWN: Uncaught exception in the SynchronizationContext. Re-thrown. at com.alibaba.nacos.shaded.io.grpc.Status.asRuntimeException(Status.jav 2024-08-13T10:21:52.93708:00 ERROR 27764 --- …...

【LLM大语言模型-开篇】LLM入门实践指南

"LLM入门实践指南"是一个通过代码实践&#xff0c;为大模型入门读者提供全面且较为深入的大模型技术视角的教程。 为何关注LLM&#xff1f; 创新与变革&#xff1a;LLM不仅推动了自然语言处理&#xff08;NLP&#xff09;领域的进步&#xff0c;还在诸多行业中催生了…...

实时视频换脸、8 万家 AI 公司消失、论文天价售卖、新的 scaling law、爆火毒舌 AI | AI 掘金视界周刊第 5 期

AI 视界周刊由战场小包维护&#xff0c;每周一更新&#xff0c;包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块&#xff0c;后续板块划分和内容撰写在周刊迭代过程中持续优化&#xff0c;欢迎大家提出建议。 欢迎大家来到《AI 视…...

XSS靶场(1-11关)

目录 简述xss xss第1关 xss第2关 ​编辑 xss第3关 xss第4关 xss第5关过滤了 on script xss第6关 xss第7关 xss第8关 xss第9关 xss第10关 xss11关 我把源代码靶场放到了最顶端 简述xss XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法…...

vue2 子组件props接收父组件对象或数组必须使用函数进行返回

export default{ name:MyComponent, props:{ title:{ type:String, default:"" }, age:{ type:Number, default:1 }, names:{ type:Array, //数组或对象必须用函数进行返回 default:function(){ return [] …...

【算法/学习】双指针

✨ 少年要迎着朝阳&#xff0c;活得肆无忌惮 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;算法学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &a…...

Springboot集成Liquibase笔记整理

添加依赖<dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId> </dependency>添加配置spring:liquibase:contexts: dev,testenabled: true编写liquibase配置类Configuration EnableConfigurationPropert…...

Python拆分无atlas图集(瑕疵版)

老板给了张没有atlas文件的图集让我拆图&#xff0c;简单写了一版凑合用。 存在的问题&#xff1a; 可能会拆出来一些小尺寸的透明像素图片&#xff1b;可能会拆出来一些偏大的小图的整体集合&#xff1b;可能会把应该是一块的小图批成两半&#xff0c;不过不多&#xff1b;其…...

SQLALchemy 排序

SQLALchemy 排序 基本用法多列排序使用函数或表达式进行排序注意事项在SQLAlchemy中,排序(Ordering)是通过order_by()方法实现的。这个方法允许你指定一个或多个列(或表达式),用于对查询结果进行排序。你可以指定升序(默认)或降序排序。 基本用法 假设你有一个User模…...

【iOS】Block底层分析

目录 前言Block底层结构Block捕获变量原理捕获局部变量&#xff08;auto、static&#xff09;全局变量捕获实例self Block类型Block的copyBlock作为返回值将Block赋值给__strong指针Block作为Cocoa API中方法名含有usingBlock的方法参数Block作为GCD API的方法参数Block属性的写…...

复现dom破坏案例和靶场

文章目录 靶场网址第一个实验步骤和原理(代码为示例要根据自己的实验修改) 第二个实验步骤和原理(代码为示例要根据自己的实验修改) 靶场网址 注册后点击 第一个实验 此实验室包含一个 DOM 破坏漏洞。注释功能允许“安全”HTML。为了解决这个实验&#xff0c;请构造一个 HT…...

【高校科研前沿】南方科技大学冯炼教授等人在遥感顶刊RSE发文:全球人类改造的基塘系统制图

1.文章简介 论文名称&#xff1a;Global mapping of human-transformed dike-pond systems&#xff08;全球人类改造的基塘系统制图&#xff09; 第一作者及单位&#xff1a;Yang Xu&#xff08;南方科技大学环境学院&#xff09; 第一通讯作者及单位&#xff1a;冯炼&#x…...

How to run angular CICD on gitlab-runner of wsl?

前提文件 .gitlab-ci.yml, .dockerignore, ci-funcs.sh, Dockerfile, karma.conf.js, nginx.conf, nginx-custom.conf, sonar-project.properties 1.test.ts const context require.context(./app/pages, true, /\.spec\.ts$/); 2.sonar-project.properties sonar.sourcessrc/…...

搭建Java集成开发环境IntelliJ IDEA

搭建Java集成开发环境&#xff08;Integrated Development Environment&#xff0c;简称IDE&#xff09;IntelliJ IDEA是一个涉及多个步骤的过程&#xff0c;旨在帮助Java开发者高效、舒适地进行编程工作。IntelliJ IDEA由JetBrains公司开发&#xff0c;以其强大的代码自动补全…...

JS逆向浏览器脱环境专题:事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决

&#x1f310;JS逆向浏览器脱环境专题&#xff1a;事件学习和编写、DOM和BOM结构、指纹验证排查、代理自吐环境通杀环境检测、脱环境框架、脱环境插件解决 &#x1f5a5;️ 浏览器事件学习和编写 浏览器事件是用户与网页交互的主要方式&#xff0c;了解并掌握这些事件的处理方…...

驾校预约学习系统--论文pf

TOC springboot373驾校预约学习系统--论文pf 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现&#xff0c;改变了几千年以来人们的生活&#xff0c;不仅仅是生活物资的丰富&#xff0c;还有精神层次的丰富。在互联网诞生之前&#xff0c;地域位置往往是人们思想上不可跨域…...

交叉编译ARM平台的OpenCV1.0

首先,从http://www.opencv.org.cn下载1.0的源码包,然后解压出来,进入解压后的目录,再进行下面的修改: 将configure 文件下列内容注释掉(有两处)&#xff0c;只保留GTK_CFLAGS"" 、GTK_LIBS"" 、have_gtkno 三项内容&#xff08;如下黑体所示&#xff09;&…...

牛客周赛 Round 56 AK

背景 语言艺术 A题&#xff1a;面包店故事 题意 一块面包要x元&#xff0c;加培根要y元&#xff0c;有n元&#xff0c;问能否买到加培根的面包 思路 大水题&#xff0c;gpt秒了 代码 #include <bits/stdc.h> using namespace std; int main() {int x, y, n; cin …...

XBeeATCmds库:Arduino嵌入式AT命令封装实践

1. XBeeATCmds 库概述&#xff1a;面向嵌入式开发者的 AT 命令封装实践XBeeATCmds 是一个专为 Arduino 平台设计的轻量级 C 封装库&#xff0c;其核心目标是将 Digi XBee 系列模块&#xff08;包括 Series 1、Series 2/2B、Series 3 及兼容 Zigbee、802.15.4、DigiMesh 协议的模…...

别再买错千元投影! 哈趣Q1Pro藏看越级体验

当下的智能投影市场正经历着深度的“去伪存真”变革&#xff0c;行业洗牌加速的同时&#xff0c;也让消费者的选购变得愈发谨慎。洛图科技数据显示&#xff0c;2025年国内智能投影市场整体销量下滑&#xff0c;其中低端投影成为调整重灾区&#xff0c;0-499元价位段销量同比大跌…...

大厂笔试面试八股文-算法-数组常考题-final

刷了200道数组题,笔试面试还是不会做?这10道搞懂就够了 刷了200道数组题,面试还是不会做? 问题不是你刷得不够多,而是没抓住核心套路。 我整理了35道大厂真题,发现其实就5个核心技巧。今天把最重要的10道题和背后的套路,全部分享给你。 offer直通车-大厂校招大礼包&#x…...

不止于配置:用Horizon UAG 21.11打造安全外网访问,别忘了这些加固设置

超越基础配置&#xff1a;Horizon UAG 21.11安全加固全指南 在虚拟桌面架构中&#xff0c;统一接入网关&#xff08;UAG&#xff09;作为内外网流量的安全屏障&#xff0c;其配置合理性直接影响整体架构的安全性。许多管理员在完成UAG基础部署后&#xff0c;往往忽略了更深层次…...

突破网盘下载限制:直链工具全攻略

突破网盘下载限制&#xff1a;直链工具全攻略 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸…...

收藏!从Prompt到Harness,AI工程升级三步搞定大模型应用

本文阐述了AI工程从关注Prompt到Context再到Harness的演进过程。Prompt工程负责明确任务指令&#xff0c;Context工程负责提供准确有效的信息供给&#xff0c;而Harness工程则关注AI在系统中的可靠执行与治理。三者并非替代关系&#xff0c;而是嵌套协作&#xff0c;共同推动AI…...

2026算力大劫:全球开发者都在问:廉价算力到底去哪了?哪里的token性价比最高?

▶︎点击这里查看最新套餐https://coding.dongyao.ren/ 1. 2026&#xff1a;被“刺客”化的算力账单 进入2026年&#xff0c;AIGC行业并没有迎来预想中的“算力普惠”。相反&#xff0c;随着GPT-5.5等万亿参数模型成为企业刚需&#xff0c;以及北美云巨头在2026年第一季度集体…...

告别996!我用Qoder AI编程平台,一天搞定全栈电商项目(附保姆级实战流程)

从零到上线&#xff1a;Qoder AI全栈电商项目实战手记 凌晨三点的显示器蓝光里&#xff0c;我第17次调试购物车接口时&#xff0c;咖啡杯底黏着的便签写着"再熬三天就能交付"。这个典型的程序员996场景&#xff0c;在上个月使用Qoder开发新电商平台时被彻底颠覆——从…...

3大实战场景解析:如何用FakeLocation实现Android应用级GPS伪装

3大实战场景解析&#xff1a;如何用FakeLocation实现Android应用级GPS伪装 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation FakeLocation是一款基于Xposed框架的Android位置模拟工…...

销售易发布AI原生CRM NeoAgent 2.0,引领行业迈入AI CRM 2.0时代

3月27日&#xff0c;在2026腾讯云城市峰会首站上海站&#xff0c;腾讯旗下CRM销售易重磅发布新一代营销服全场景AI原生CRM——NeoAgent 2.0。这不仅是产品迭代&#xff0c;更是销售易基于全新架构打造的智能体产品矩阵&#xff0c;标志着CRM开始从“管理工具”向“企业数字员工…...