C++ __int64用法

本文详细介绍了在ACM竞赛中处理较大整数的方法,包括C++的64位整数扩展,如__int64与unsigned__int64在VC6.0和g++编译器中的使用,以及输入输出技巧。

在做ACM题时, 经常都会遇到一些比较大的整数。而常用的内置整数类型常常显得太小了:其中long和int范围是[-2^31,2^31),即-2147483648~2147483647。而unsigned范围是[0,2^32),即0~4294967295。也就 是说,常规的32位整数只能够处理40亿以下 的数。

  那遇 到比40亿要大的数怎么办呢?这时就要用到C++的64位扩展 了。不同的编译器对64位整数的扩展有所不同。基于ACM的需 要,下面仅介绍VC6.0与g++编译器的 扩展。
  
VC的64位整数 分别叫做__int64与unsigned __int64,其范 围分别是[-2^63, 2^63)与[0,2^64),即-9223372036854775808~9223372036854775807与0~18446744073709551615(约1800亿亿)。对64位整数 的运算与32位整数基本相同,都支持四则运算与位运算等。当进行64位与32位的混 合运算时,32位整数会被隐式转换成64位整 数。但是,VC的输入输出与__int64的兼容 就不是很好了,如果你写下这样一段代码:
1__int64 a;
2cin>>a;
3cout<<a;

那么,在 第2行会收到“error C2679: binary '>>' : no operator defined which takes a right-hand operand of type '__int64' (or there is no acceptable conversion)”的错 误;在第3行会收到“error C2593: 'operator <<' is ambiguous”的错误。那是不是就不能进行输入输出呢?当然不是,你可以使用C的写 法:
scanf("%I64d",&a);
printf("%I64d",a);
就可以正确输入输出了。当使用unsigned __int64时,把"I64d"改为"I64u"就可以 了。
  OJ通常使 用g++编译器。其64位扩展方 式与VC有所不同,它们分别叫做long long与unsigned long long。处理规 模与除输入输出外的使用方法同上。对于输入输出,它的扩展比VC好。既可以使用
1long long a;
2cin>>a;
3cout<<a;
也可以使用
scanf("%lld",&a);
printf("%lld",a);

使用无符号数时,将"%lld"改成"%llu"即可。
  最后我补充一点:作为一个特例,如果你使用的 是Dev-C++的g++编译器,它使用的是"%I64d"而非"%lld"。

在 YOLOv8 模型中添加自定义层(如 `DecBBox`)并注册到 PyTorch 中,通常涉及对模型结构的扩展,以便支持特定功能或适配目标硬件平台。以下是具体的实现方法: ### 定义自定义层 自定义层可以通过编写 C++ 代码并结合 PyTorch 的扩展机制实现。例如,定义 `DecBBox` 层时,需要包含必要的头文件,并实现该层的前向传播逻辑。以下是一个示例实现: ```cpp #include <torch/script.h> torch::Tensor DecBBox(torch::Tensor input0, torch::Tensor bias, int64_t num_anchors, int64_t num_coords, int64_t num_classes, int64_t m_gridH, int64_t m_gridW, int64_t m_imgW, int64_t m_imgH, int64_t useClassId, int64_t calc_mode, int64_t clip_box, int64_t share_loc, int64_t multi_label) { bool isSingleLabel = (calc_mode == 3 || calc_mode == 5 || calc_mode == 8) && multi_label == 0; if (isSingleLabel || calc_mode == 2) { return torch::zeros({1, 1, 5 + useClassId, input0.size(3)}); } else { return torch::zeros({1, num_classes, 5 + useClassId, input0.size(3)}); } } ``` ### 注册自定义层 在定义完自定义层的计算逻辑后,需要将其注册到 PyTorch 中,以便模型能够识别并调用该层。通过 `torch::RegisterOperators` 接口完成注册,如下所示: ```cpp static auto registry = torch::RegisterOperators("custom_ops::DecBBox", &DecBBox); ``` 上述代码将 `DecBBox` 层注册为 `custom_ops::DecBBox`,确保在模型中可以通过该名称调用此操作 [^3]。 ### 在 PyTorch 模型中使用 完成注册后,可以在 PyTorch 模型中使用自定义层。例如,在模型的 `forward` 方法中调用该层: ```python import torch class CustomModel(torch.nn.Module): def __init__(self): super(CustomModel, self).__init__() self.dec_bbox = torch.ops.custom_ops.DecBBox def forward(self, input0, bias, num_anchors, num_coords, num_classes, m_gridH, m_gridW, m_imgW, m_imgH, useClassId, calc_mode, clip_box, share_loc, multi_label): return self.dec_bbox(input0, bias, num_anchors, num_coords, num_classes, m_gridH, m_gridW, m_imgW, m_imgH, useClassId, calc_mode, clip_box, share_loc, multi_label) ``` 上述代码定义了一个包含 `DecBBox` 层的自定义模型,并在 `forward` 方法中调用该层进行推理 [^3]。 ### 集成到 YOLOv8 模型 在 YOLOv8 模型中集成 `DecBBox` 层时,需要修改 `head.py` 文件中的 `forward` 方法,以替换或扩展原有的检测头逻辑。具体操作包括: - 在模型定义中导入自定义层。 - 替换原有的解码逻辑为 `DecBBox` 层的调用。 - 确保输入张量和参数与 `DecBBox` 层的接口一致。 完成上述修改后,即可将模型导出为 ONNX 格式,并在海思 hi3519dv500 和 hi3516dv500 芯片上部署 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值