是否可以在不定义 class 的情况下重载 [] 运算符以访问 char 的特定位?
Is it possible to overload the [] operator to access a specific bit of a char without defining a class?
我得到了一个练习,其中包括大量摆弄(查看)char[n]
中的位。
我必须检查 bit[n][8]
的一些几何属性,这些属性是通过获取每个字符并将其拆分成位来获得的。我知道我可以通过执行 c&((1<<8)>>n)
.
之类的操作来访问 char c
的 bit[a]
我想知道是否有办法让 c[n]
实际上 成为 c&((1<<8)>>n)
。我试过 bool operator [](char c,int n);
但那给了我这个:
error: ‘bool operator[](char, int)’ must be a nonstatic member function
bool operator [](char c,int n);
正如错误消息所说,operator[] 必须是 class 或结构的成员函数,并且必须有一个参数。但是,您可以编写一个自由命名函数(即不是运算符)来执行您想要的操作。
这是一个名为 Char
的 char
包装器 class。 main()
中的两个示例表明您可以像使用 char
值一样使用 Char
类型的值,除了 Char
有一个 [] 运算符,用于获取其值位在某个给定的索引处。
#include <iostream>
class Char {
char c;
public:
Char() = default;
Char(const Char&) = default;
Char(char src) : c(src) {}
Char& operator = (char src) { c = src; return *this; }
operator const char& () const { return c; }
operator char& () { return c; }
// Special [] operator
// This is read-only -- making a writable (non-const)
// version is possible, but more complicated.
template <typename I>
bool operator [](I bit_idx) const { return !!(c & (char(1) << bit_idx)); }
};
int main() {
// Example 1
// Initialize a new Char value, just like using char.
Char my_char = 'x';
// Math operators work as expected
++my_char;
// And cout will produce the same output as a char value
std::cout << "Bit 3 of '" << my_char << "' is ";
// But unlike a char, the [] operator gives you
// the bit at an index, as a bool value.
std::cout << my_char[3] << "\n\n";
//Example 2
// Specify the Char type in a range-based for loop to
// iterate through an array of char values, as Char values.
const char str[] = "Tasty";
for(Char ch : str) {
// check if value is nonzero, the same as you would a char value
if(ch) {
// Send the value to cout,
// cast to an int to see the ASCII code
std::cout << ch << " (" << static_cast<int>(ch) << ") ";
// Count down from bit 7 to 0 and use
// the special [] operator to get each
// bit's value. Use this to output each
// value's binary digits.
for(int bit=7; bit>=0; --bit) {
std::cout << ch[bit];
}
std::cout << '\n';
}
}
}
输出:
Bit 3 of 'y' is 1
T (84) 01010100
a (97) 01100001
s (115) 01110011
t (116) 01110100
y (121) 01111001
我得到了一个练习,其中包括大量摆弄(查看)char[n]
中的位。
我必须检查 bit[n][8]
的一些几何属性,这些属性是通过获取每个字符并将其拆分成位来获得的。我知道我可以通过执行 c&((1<<8)>>n)
.
c
的 bit[a]
我想知道是否有办法让 c[n]
实际上 成为 c&((1<<8)>>n)
。我试过 bool operator [](char c,int n);
但那给了我这个:
error: ‘bool operator[](char, int)’ must be a nonstatic member function
bool operator [](char c,int n);
正如错误消息所说,operator[] 必须是 class 或结构的成员函数,并且必须有一个参数。但是,您可以编写一个自由命名函数(即不是运算符)来执行您想要的操作。
这是一个名为 Char
的 char
包装器 class。 main()
中的两个示例表明您可以像使用 char
值一样使用 Char
类型的值,除了 Char
有一个 [] 运算符,用于获取其值位在某个给定的索引处。
#include <iostream>
class Char {
char c;
public:
Char() = default;
Char(const Char&) = default;
Char(char src) : c(src) {}
Char& operator = (char src) { c = src; return *this; }
operator const char& () const { return c; }
operator char& () { return c; }
// Special [] operator
// This is read-only -- making a writable (non-const)
// version is possible, but more complicated.
template <typename I>
bool operator [](I bit_idx) const { return !!(c & (char(1) << bit_idx)); }
};
int main() {
// Example 1
// Initialize a new Char value, just like using char.
Char my_char = 'x';
// Math operators work as expected
++my_char;
// And cout will produce the same output as a char value
std::cout << "Bit 3 of '" << my_char << "' is ";
// But unlike a char, the [] operator gives you
// the bit at an index, as a bool value.
std::cout << my_char[3] << "\n\n";
//Example 2
// Specify the Char type in a range-based for loop to
// iterate through an array of char values, as Char values.
const char str[] = "Tasty";
for(Char ch : str) {
// check if value is nonzero, the same as you would a char value
if(ch) {
// Send the value to cout,
// cast to an int to see the ASCII code
std::cout << ch << " (" << static_cast<int>(ch) << ") ";
// Count down from bit 7 to 0 and use
// the special [] operator to get each
// bit's value. Use this to output each
// value's binary digits.
for(int bit=7; bit>=0; --bit) {
std::cout << ch[bit];
}
std::cout << '\n';
}
}
}
输出:
Bit 3 of 'y' is 1
T (84) 01010100
a (97) 01100001
s (115) 01110011
t (116) 01110100
y (121) 01111001