p135~p140:
1、位运算符。作用于整数类型的运算对象,并把运算对象看成是二进制的集合,提供检查和设置二进制位的功能。
2、bitest:一种可表示任意大小的二进制位集合的标准库类型。
3、关于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型。
4、移位运算符:对运算对象执行基于二进制位的移动操作。(移向边界的位被舍弃掉)
#include<iostream> using std::cout; using std::endl; int main() { unsigned int bit1 = 1; // 00000001 cout << bit1 << endl; // 1 unsigned int bit2 = bit1 << 1; // 00000010,bit1的值并没有改变 cout << bit2 << endl; // 2 return 0; }
5、位求反运算符。ps:求无符号类型范围的好办法
#include<iostream> using std::cout; using std::endl; int main() { unsigned int bit1 = 0; // 00000000...0 cout << bit1 << endl; // 0 unsigned int bit2 = ~bit1; // 1111111...1 cout << bit2 << endl; // 4294967295 return 0; }
6、位与,位或,位异或。(相异为1,否则就是0)
#include<iostream> using std::cout; using std::endl; int main() { unsigned int bit1 = 1; // 00000000..01 cout << bit1 << endl; // 1 unsigned int bit2 = 2; // 00000000..10 cout << bit2 << endl; // 2 unsigned int bit3 = bit1 ^ bit2; // 00000000..11 cout << bit3 << endl; return 0; }
7、p137课本示例。(修改、查看27号同学的及格情况)
#include<iostream> using std::cout; using std::endl; int main() { unsigned long quiz1 = 0; // unsigned long类型在任何机器上至少有32位 quiz1 |= 1UL << 27; // 1UL是unsigned long类型的整数字面值1 // 修改为原始值 quiz1 &= ~(1UL << 27); // 检查学生27测试的情况到底怎么样 bool status = quiz1 & (1UL << 27); cout << status << endl; return 0; }
p139
1、sizeof的作用:返回一条表达式或者一个类型名字所占的字节数,返回值类型为size_t。
2、具体用法:sizeof(type)或者sizeof expr。
3、特点:1)满足右结合律。2)不实际求运算对象的值。(因此运算对象可以是解引用无效指针)
4、应用实例:求数组中元素的个数。
#include<iostream> using std::cout; int main() { int ia[] = {1, 2, 3, 4, 5}; constexpr size_t sz = sizeof(ia)/sizeof(*ia); int arr2[sz]; // 正确:sizeof返回一个常量表达式 cout << sz << std::endl; // 5 return 0; }
练习 4.25
'q':01110001
~'q':10001110
~'q'<<6:10000000
练习 4.26
练习 4.27
ull = 3 // 000...0000011
ul2 = 7 // 000...0000111
a 000...0000011
b 000...0000111
c 000...0000001
d 000...0000001
练习 4.28
#include<iostream> using std::cout; using std::endl; int main() { cout << sizeof(bool) << ' ' << sizeof(char) << ' ' << sizeof(wchar_t) << ' ' << sizeof(char16_t) << ' ' << sizeof(char32_t) << ' ' << sizeof(short) << ' ' << sizeof(int) << ' ' << sizeof(long) << ' ' << sizeof(long long) << ' ' << sizeof(float) << ' ' << sizeof(double) << ' ' << sizeof(long double) << ' ' << endl; return 0; } /* output: 1 1 2 2 4 2 4 4 8 4 8 12 */
练习 4.29
#include<iostream> using std::cout; using std::endl; int main() { int x[10]; int *p = x; cout << sizeof(x)/sizeof(*x) << endl; // 10 cout << sizeof(p)/sizeof(*p) << endl; // 1 return 0; }
练习 4.30
a sizeof(x + y)
b sizeof(p->men[i])
c (sizeof a) < b
d sizeof (f())