Compare commits
	
		
			2 Commits
		
	
	
		
			6f86054fb6
			...
			49565a55df
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 49565a55df | |||
| 1ab9831597 | 
							
								
								
									
										20
									
								
								day6/d8.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								day6/d8.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,20 @@ | |||||||
|  | /*
 | ||||||
|  |     0b 1100 0011 << 2   -67 | ||||||
|  |     0b 0000 1100        12 | ||||||
|  | 
 | ||||||
|  |     将二进制数向左(高位)移动,低位补0.   | ||||||
|  |     [注意]左移是包含符号位的. | ||||||
|  | */ | ||||||
|  | #include <iostream> | ||||||
|  | #include <bitset> | ||||||
|  | 
 | ||||||
|  | using namespace std; | ||||||
|  | 
 | ||||||
|  | int main() | ||||||
|  | { | ||||||
|  |     char n = 0b11000011;                                 // 0b 表示二进制表示法 0b11000011 = 195
 | ||||||
|  |     cout << "n = " << bitset<8>(n) << endl;              // n = 11000011
 | ||||||
|  |     n = n << 2;                                          // 建议不要使用 <<= 运算符,因为它会改变 n 的类型   // 0b00001100 = 12  195 << 2 = 12
 | ||||||
|  |     cout << "n = " << bitset<8>(n) << "\t" << (int)n << endl; // n = 00001100
 | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
							
								
								
									
										28
									
								
								day6/d9.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								day6/d9.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | |||||||
|  | /*
 | ||||||
|  |     二进制的数向低位(右), 负数的情况下,符号位如果不变则为算术右移,如果符号位变为0时,则为逻辑右移.当右移操作时,由编译器决定是算术右移还是逻辑右移. | ||||||
|  | */ | ||||||
|  | #include <iostream> | ||||||
|  | #include <bitset> | ||||||
|  | 
 | ||||||
|  | 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; | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user