diff --git a/day6/d9.cpp b/day6/d9.cpp new file mode 100644 index 0000000..66ca9e6 --- /dev/null +++ b/day6/d9.cpp @@ -0,0 +1,28 @@ +/* + 二进制的数向低位(右), 负数的情况下,符号位如果不变则为算术右移,如果符号位变为0时,则为逻辑右移.当右移操作时,由编译器决定是算术右移还是逻辑右移. +*/ +#include +#include + +using namespace std; + +int main() +{ + char n = 0xff; // 0b1111 1111 + + /* + 逻辑右移和算术右移是两种不同的右移运算方法.在逻辑右移中,最高位移出去后直接补0,而在算术右移中,最高位移出去后,根据符号位进行补位.具体地说,如果一个数是正数,那么在算术右移中最高位补0,如果一个数是负数,那么在算术右移中最高位补1. + 这两种右移方法的区别在于对负数的处理方式.在逻辑右移中,因为最高位直接补0,所以负数的补码变化后仍然是一个负数.但在算术右移中,针对负数最高位补1的处理方式,会导致补码变化后变成了一个更小的负数.因此,算术右移通常被用于处理带符号整数的情况,而逻辑右移则通常用于处理无符号整数的情况. + */ + n = n >> 4; // 逻辑右移: 0b0000 1111 ; 算术右移: 0b1111 1111 + + // 如何判断高 4 位是 1111 还是 0000 + // 1. 逻辑右移, 0b0000 1111 + // 2. 算术右移, 0b1111 1111 + if (n & 0xff == 0x0f) + cout << "0xff >> 4 进行逻辑右移, 结果: " << bitset<8>(n) << endl; + else + cout << "0xff >> 4 进行算术右移, 结果: " << bitset<8>(n) << endl; + + return 0; +} \ No newline at end of file