uint128_t 添加 c++ 重载类型强制转换
类型声明:
- class uint128
- {
- public:
- uint128() :hi(), lo(){}
- uint128(uint32_t l) :hi(), lo(l){}
- uint128(int32_t l) :hi(-(l < )), lo(l){}
- uint128(int64_t l) :hi(-(l < )), lo(l){}
- uint128(uint64_t l) :hi(), lo(l){}
- uint128(const std::string& s);
- uint128(uint64_t _h, uint64_t _l)
- :hi(_h), lo(_l){}
- bool operator == (const uint128& o)const{ return hi == o.hi && lo == o.lo; }
- bool operator != (const uint128& o)const{ return hi != o.hi || lo != o.lo; }
- bool operator < (const uint128& o)const { return (hi == o.hi) ? lo < o.lo : hi < o.hi; }
- bool operator < (const int64_t& o)const { return *this < uint128(o); }
- bool operator !()const { return !(hi != || lo != ); }
- uint128 operator -()const { return ++uint128(~hi, ~lo); }
- uint128 operator ~()const { return uint128(~hi, ~lo); }
- uint128& operator++() { hi += (++lo == ); return *this; }
- uint128& operator--() { hi -= (lo-- == ); return *this; }
- uint128 operator++(int) { auto tmp = *this; ++(*this); return tmp; }
- uint128 operator--(int) { auto tmp = *this; --(*this); return tmp; }
- uint128& operator |= (const uint128& u) { hi |= u.hi; lo |= u.lo; return *this; }
- uint128& operator &= (const uint128& u) { hi &= u.hi; lo &= u.lo; return *this; }
- uint128& operator ^= (const uint128& u) { hi ^= u.hi; lo ^= u.lo; return *this; }
- uint128& operator <<= (const uint128& u);
- uint128& operator >>= (const uint128& u);
- uint128& operator += (const uint128& u) { const uint64_t old = lo; lo += u.lo; hi += u.hi + (lo < old); return *this; }
- uint128& operator -= (const uint128& u) { return *this += -u; }
- uint128& operator *= (const uint128& u);
- friend uint128 operator + (const uint128& l, const uint128& r) { return uint128(l) += r; }
- friend uint128 operator + (const uint128& l, const uint64_t& r) { return uint128(l) += uint128(r); }
- friend uint128 operator + (const uint128& l, const uint32_t& r) { return uint128(l) += uint128(r); }
- friend uint128 operator + (const uint128& l, const int32_t& r) { return uint128(l) += uint128(r); }
- friend uint128 operator + (const uint64_t& l, const uint128& r) { return uint128(l) += r; }
- friend uint128 operator - (const uint128& l, const uint128& r) { return uint128(l) -= r; }
- friend uint128 operator * (const uint128& l, const uint128& r) { return uint128(l) *= r; }
- friend uint128 operator * (const uint128& l, const uint64_t& r) { return uint128(l) *= uint128(r); }
- friend uint128 operator * (const uint128& l, const uint32_t& r) { return uint128(l) *= uint128(r); }
- friend uint128 operator | (const uint128& l, const uint128& r) { return uint128(l) = (r); }
- friend uint128 operator & (const uint128& l, const uint128& r) { return uint128(l) &= r; }
- friend uint128 operator & (const uint128& l, const uint64_t& r) { return uint128(l) &= uint128(r); }
- friend uint128 operator ^ (const uint128& l, const uint128& r) { return uint128(l) ^= r; }
- friend uint128 operator << (const uint128& l, const uint128& r) { return uint128(l) <<= r; }
- friend uint128 operator >> (const uint128& l, const uint128& r) { return uint128(l) >>= r; }
- friend uint128 operator >> (const uint128& l, const int32_t& r) { return uint128(l) >>= uint128(r); }
- friend bool operator > (const uint128& l, const uint128& r) { return r < l; }
- friend bool operator >(const uint128& l, const int64_t& r) { return uint128(r) < l; }
- friend bool operator > (const int64_t& l, const uint128& r) { return r < uint128(l); }
- friend bool operator >= (const uint128& l, const uint128& r) { return l == r || l > r; }
- friend bool operator >= (const uint128& l, const int64_t& r) { return l >= uint128(r); }
- friend bool operator >= (const int64_t& l, const uint128& r) { return uint128(l) >= r; }
- friend bool operator <= (const uint128& l, const uint128& r) { return l == r || l < r; }
- friend bool operator <= (const uint128& l, const int64_t& r) { return l <= uint128(r); }
- friend bool operator <= (const int64_t& l, const uint128& r) { return uint128(l) <= r; }
- operator uint64_t() { return lo; } //强制转换为uint64_t
- operator uint32_t() { return (uint32_t)lo; } //强制转换为uint32_t
- operator int32_t() { return (int32_t)lo; } //强制转换为int32_t
- uint32_t low_32_bits()const { return (uint32_t)lo; }
- uint64_t low_bits()const { return lo; }
- uint64_t high_bits()const { return hi; }
- uint64_t hi;
- uint64_t lo;
- };
实现函数:
- uint128::uint128(const std::string &sz)
- :hi(), lo()
- {
- // do we have at least one character?
- if (!sz.empty()) {
- // make some reasonable assumptions
- int radix = ;
- bool minus = false;
- std::string::const_iterator i = sz.begin();
- // check for minus sign, i suppose technically this should only apply
- // to base 10, but who says that -0x1 should be invalid?
- if (*i == '-') {
- ++i;
- minus = true;
- }
- // check if there is radix changing prefix (0 or 0x)
- if (i != sz.end()) {
- if (*i == '') {
- radix = ;
- ++i;
- if (i != sz.end()) {
- if (*i == 'x') {
- radix = ;
- ++i;
- }
- }
- }
- while (i != sz.end()) {
- unsigned int n = ;
- const char ch = *i;
- if (ch >= 'A' && ch <= 'Z') {
- if (((ch - 'A') + ) < radix) {
- n = (ch - 'A') + ;
- }
- else {
- break;
- }
- }
- else if (ch >= 'a' && ch <= 'z') {
- if (((ch - 'a') + ) < radix) {
- n = (ch - 'a') + ;
- }
- else {
- break;
- }
- }
- else if (ch >= '' && ch <= '') {
- if ((ch - '') < radix) {
- n = (ch - '');
- }
- else {
- break;
- }
- }
- else {
- /* completely invalid character */
- break;
- }
- (*this) *= radix;
- (*this) += n;
- ++i;
- }
- }
- if (minus) {
- *this = -*this;
- }
- }
- }
- uint128& uint128::operator<<=(const uint128& rhs)
- {
- if (rhs >= )
- {
- hi = ;
- lo = ;
- }
- else
- {
- unsigned int n = rhs.to_integer();
- const unsigned int halfsize = / ;
- if (n >= halfsize){
- n -= halfsize;
- hi = lo;
- lo = ;
- }
- if (n != ) {
- // shift high half
- hi <<= n;
- const uint64_t mask(~(uint64_t(-) >> n));
- // and add them to high half
- hi |= (lo & mask) >> (halfsize - n);
- // and finally shift also low half
- lo <<= n;
- }
- }
- return *this;
- }
- uint128 & uint128::operator>>=(const uint128& rhs)
- {
- if (rhs >= )
- {
- hi = ;
- lo = ;
- }
- else
- {
- unsigned int n = rhs.to_integer();
- const unsigned int halfsize = / ;
- if (n >= halfsize) {
- n -= halfsize;
- lo = hi;
- hi = ;
- }
- if (n != ) {
- // shift low half
- lo >>= n;
- // get lower N bits of high half
- const uint64_t mask(~(uint64_t(-) << n));
- // and add them to low qword
- lo |= (hi & mask) << (halfsize - n);
- // and finally shift also high half
- hi >>= n;
- }
- }
- return *this;
- }
- uint128& uint128::operator*=(const uint128 &b)
- {
- uint64_t a0 = (uint32_t)(this->lo);
- uint64_t a1 = (uint32_t)(this->lo >> 0x20);
- uint64_t a2 = (uint32_t)(this->hi);
- uint64_t a3 = (uint32_t)(this->hi >> 0x20);
- uint64_t b0 = (uint32_t)(b.lo);
- uint64_t b1 = (uint32_t)(b.lo >> 0x20);
- uint64_t b2 = (uint32_t)(b.hi);
- uint64_t b3 = (uint32_t)(b.hi >> 0x20);
- this->hi = ;
- this->lo = a3*b0;
- (*this) += a2*b1;
- (*this) += a1*b2;
- (*this) += a0*b3;
- (*this) <<= 0x20;
- (*this) += a2*b0;
- (*this) += a1*b1;
- (*this) += a0*b2;
- (*this) <<= 0x20;
- (*this) += a1*b0;
- (*this) += a0*b1;
- (*this) <<= 0x20;
- (*this) += a0*b0;
- return *this;
- }
uint128_t 添加 c++ 重载类型强制转换的更多相关文章
- C#高级编程9-第7章 运算符和类型强制转换
运算符和类型强制转换 1.运算符 运算符的简化操作 条件运算符: if-else的简化操作,也称三元运算符.如果条件为真,返回一个值,为假返回另外一个值. condition?true_value:f ...
- C#高级编程 (第六版) 学习 第六章:运算符和类型强制转换
第六章 运算符和类型强制转换 1,运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ ...
- C#学习笔记二 (资源托管,泛型,数组和元组,运算符和类型强制转换)
托管和非托管资源 1.托管资源是指GC管理的内存空间,非托管资源是指文件句柄,网络连接,数据库连接等. 2.方法中临时申请的变量,被存放在栈中.栈存储非对象成员的值数据.例如在方法中有B b=new ...
- 3_PHP表达式_5_数据类型转换_类型强制转换
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 3.5.2 类型强制转换 类型强制转换允许编程人员手动将变量的数据 ...
- C# 运算符和类型强制转换(6) 持续更新
C#支持的运算符 https://msdn.microsoft.com/zh-cn/library/6a71f45d(v=vs.140).aspx checked 和 unchecked ; b++; ...
- 【读书笔记】C#高级编程 第七章 运算符和类型强制转换
(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 < ...
- C#高级编程笔记 2016年10月8日运算符和类型强制转换
1.checked和unchecked 运算符 C#提供了checked 和uncheckde 运算符.如果把一个代码块标记为checked, CLR就会执行溢出检查,如果发生溢出,就抛出overfl ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- OC中的类型强制转换
在Objective-C中,以数字格式组成的字符串经常需要转换为NSNumber对象后再使用.例如有一个字符串对象@"111.22",需要转为NSNumber对象,最简单的方法就是 ...
随机推荐
- IDEA Java 源发行版 8 需要目标发行版 1.8
[问题记录] maven新建的一个项目,需要到一些java8的一些特性,但是在编译的时候就报错了,提示这样的错误. 我是在用二进制字面量出现的这个问题,二进制自变量是Java7的特性, 你可以这样写 ...
- 【AtCoder】CODE FESTIVAL 2016 qual A
CODE FESTIVAL 2016 qual A A - CODEFESTIVAL 2016 -- #include <bits/stdc++.h> #define fi first # ...
- Kubernetes---启动及退出动作
apiVersion: v1 kind: Pod metadata: name: lifecycle-demo spec: containers: - name:lifecycle-demo-cont ...
- C/C++快读(快速读入)有多——安全AC
在一些算法题目中中,有的程序会被卡常(数),就是说,程序虽然渐进复杂度,(通俗来讲:算法的时间复杂度)可以接受,但因为算法本身的时间常数过大,导致程序在一些算法竞赛中超时.这是,快读就显得尤为重要了. ...
- centos8自定义目录安装php7.3
1.目录结构 源码目录:/home/werben/pkgsrc/php-7.3.11 安装目录:/home/werben/application/php7.3.11 2.下载php源码 # 官网地址: ...
- S02_CH01_Hello World实验
S02_CH01_Hello World实验 ZYNQ是一款SOC芯片,在前面第一季的学习当中,我们只是粗略的学习了ZYNQ的PL部分,对于ZYNQ最突出的功能,其内部的双核Cortex-A9内核并未 ...
- .Net下二进制形式的文件存储与读取
.Net下图片的常见存储与读取凡是有以下几种:存储图片:以二进制的形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[].1.参数是图片路径:返回 ...
- SpringBoot + Dubbo + zookeeper 搭建简单分布式服务
SpringBoot + Dubbo + zookeeper 搭建简单分布式服务 详细操作及源码见: https://github.com/BillyYangOne/dubbo-springboot
- Vue.prototype详解
参考地址:Vue.prototype详解 如果需要设置 全局变量,在main.js中,Vue实例化的代码里添加. 不想污染全局作用域.这种情况下,你可以通过在 原型 上定义它们使其在每个Vue实例中可 ...
- STM32点亮LED
原理图 测试灯,接GPIO外设B,Pin 12 举例 前提,工程模版建立好 #include "stm32f10x.h" void delay(u32 i) { while(i-- ...