棋盘放麦子【指数爆炸问题】--位运算:左/右移--对数据溢出的理解

棋盘放麦子【指数爆炸问题】--对数据溢出的理解

题目

代码

cpp 复制代码
#include <iostream>
using namespace std;

int main() {
    // 正确实现:使用无符号类型和位运算
    unsigned long long total = (1ULL << 63) * 2 - 1; 
     //2^0 + 2^1 + ... + 2^63 = 2^64 - 1【等比数列公式得出】 等价2^64-1
    //位运算 【左移】 1ULL << 63能精确表示2^63,再乘2得到2^64
    
    左移运算<<是CPU基础指令,比函数调用(如pow)快数千倍
    但是 左/右移运算的优先级小于运算符,固一定要加括号
    左移=2的n次方
    右移运算=除以2
    
    cout << total;  // 输出18446744073709551615
    return 0;
}

数据类型的选择

判断正负:

需要负数 → 选有符号类型(int, long)

只需非负 → 选无符号(unsigned...,容量翻倍)

1ULL是什么

1ULL是什么?

字母含义:

U → 无符号(Unsigned,只存非负数)

LL → 超长整型(Long Long,64位存储)

遇到溢出怎么办:

现象:正数变负数/结果异常小

对策:升级到更大的类型(如int→long→unsigned long long)

相关推荐
noipp几秒前
推荐题目:洛谷 B2099 矩阵交换行
线性代数·算法·矩阵
是个西兰花17 分钟前
Linux:深入解析Linux线程原理与实现
linux·运维·c++·线程·互斥锁
五条凪2 小时前
简单理解 BM25 与 TF-IDF
人工智能·算法·搜索引擎·全文检索·tf-idf
小保CPP2 小时前
OCR C++ Tesseract基础用法
c++·人工智能·ocr·模式识别·光学字符识别
行者全栈架构师2 小时前
【码动四季】Spring Boot 可观测性体系:Micrometer + OpenTelemetry + Grafana 全链路搭建
java·算法·架构
TCW11212 小时前
AI底层系列:用C++实现线性代数的公式推导与算法设计-8.线性变化(3)
c++·人工智能·算法
皓月斯语3 小时前
B3849 [GESP样题 三级] 进制转换 题解
c++·算法·题解
中微极客3 小时前
剪枝与量化:让YOLO在边缘设备上高效部署
算法·yolo·剪枝
Ljwuhe3 小时前
C++——模板进阶
开发语言·c++
hehelm3 小时前
AI 大模型接入 SDK —项目概述
linux·服务器·网络·数据库·c++