控制硬件时,常涉及打开/关闭特定的位或查看他们的状态,一般都会使用到按位运算符技术。
一个面试题:
int a = 1, b = 32;
print("%d, %d", a<<b, 1<<32);
答案是 1,0
为什么a << b 的结果是1? 运行时会将操作数b对32取模,然后在进行移位操作。
为什么1 << 32 的结果是0?只有在运行时才会进行按位运算操作数取模优化,而常量表达式是在编译之时由编译器计算出结果。
但这个取模的优化操作网上也没有找到资料详细介绍,便自己测试了一下,
1. 如果是int类型,移动的位数超过32时会对32取模。
2. 取模的数固定为32, 不会因为被赋值数的数据类型而改变。
int a = 1;
int b = 17;
short int res1 = a << b;
short int res2 = 1 << 16;
std::cout << res1 << std::endl; // res1 = 0 只会对32取模,而不会对short int的大小(16)取模
std::cout << res2 << std::endl; // res2 = 0