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) << '\n'
    << sizeof(char) << '\n'
    << sizeof(wchar_t) << '\n'
    << sizeof(char16_t) << '\n'
    << sizeof(char32_t) << '\n'
    << sizeof(short) << '\n'
    << sizeof(int) << '\n'
    << sizeof(long) << '\n'
    << sizeof(long long) << '\n'
    << sizeof(float) << '\n'
    << sizeof(double) << '\n'
    << sizeof(long double) << '\n'
    << 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())