ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入理解C++ 重载 <十四>按位异或运算符

深入理解C++ 重载 <十四>按位异或运算符 C 中的^运算符重载详解1. 什么是^运算符重载^是 C 中的按位异或运算符Bitwise XOR。通过运算符重载我们可以让自定义类型也支持^操作。^是一个二元运算符重载时可以写成成员函数ReturnType operator^(const OtherType other) const;左操作数是this非成员函数友元/自由函数ReturnType operator^(const T a, const T b);更推荐支持两侧隐式转换2. 异或的数学性质重载时常用异或有几个非常重要的性质理解了它们才能设计出有意义的^重载性质表达式交换律a ^ b b ^ a结合律(a ^ b) ^ c a ^ (b ^ c)自反性a ^ a 0单位元a ^ 0 a逆元a ^ b ^ b a可用于还原因为a ^ b ^ b a异或天然具备可逆特性这是它最常用于加密、校验、切换状态的原因。3. 典型应用场景^重载最常见的用途标志位切换Toggleflags ^ SomeFlag;有则关、无则开状态机 / 奇偶校验异或天然适合做 parity、checksum加密算法XOR 加密是最简单的对称加密集合的对称差A ^ B表示只在一个集合中出现的元素4. 关键点要点说明返回值通常返回新对象值而非引用参数用const避免拷贝const 修饰成员函数版应加const不修改自身与^配套通常一起重载支持就地修改语义清晰只在符合异或语义切换、对称差时重载否则易误用#include iostream #include string class Permissions { private: unsigned int flags_; public: enum Flag { None 0, Read 1 0, // 0001 Write 1 1, // 0010 Execute 1 2 // 0100 }; Permissions(unsigned int f None) : flags_(f) {} // 重载 ^ 返回两个权限的对称差交集部分被抵消 Permissions operator^(const Permissions other) const { return Permissions(flags_ ^ other.flags_); } // 重载 ^ 就地切换有则关无则开 Permissions operator^(const Permissions other) { flags_ ^ other.flags_; return *this; } bool has(Flag f) const { return (flags_ f) ! 0; } std::string toString() const { std::string s; if (has(Read)) s R; if (has(Write)) s W; if (has(Execute)) s X; return s.empty() ? (none) : s; } }; int main() { Permissions rw(Permissions::Read | Permissions::Write); // 1) 用 ^ 切换 Write原本有切换后没有 Permissions toggled rw ^ Permissions::Write; std::cout rw ^ Write toggled.toString() \n; // R // 2) 再异或一次 Write又切换回来了可逆性 Permissions back toggled ^ Permissions::Write; std::cout R ^ Write back.toString() \n; // RW // 3) 对称差rw 与 rwx 的交集 RW 被抵消只剩 X Permissions rwx(Permissions::Read | Permissions::Write | Permissions::Execute); Permissions diff rw ^ rwx; std::cout rw ^ rwx diff.toString() \n; // X // 4) 用 ^ 就地切换 Permissions p(Permissions::Read); p ^ Permissions::Execute; // 加上 X std::cout R ^ X p.toString() \n; // RX p ^ Permissions::Read; // 去掉 R std::cout RX ^ R p.toString() \n; // X // 5) 自反性任何值与自身异或为 0 Permissions self rwx ^ rwx; std::cout rwx ^ rwx self.toString() \n; // (none) return 0; }
返回列表