2.58 编写过程is_little_endian,小端机器返回1,否则返回0。
#include <iostream>
int is_little_endian();
int main()
{
printf("%d/n", is_little_endian());
//std::cout << is_little_endian();
}
int is_little_endian() {
int x = 0x1234;
char* p= (char*)&x;
printf("%x \n", *p);
return *p == 0x34?1:0;
}
- 输出结果如下图:
2.59
void bitExpression() {
unsigned int x = 0x89abcdef;
unsigned int y = 0x76543210;
unsigned int c = x & 0x000000ff; //求出地位 即:0x000000ef
unsigned int d = y & 0xffffff00; //求出高位 即:0x7654300
printf("%x", d + c); //得出位计算后的相加值,得到0x76543ef
- 输出结果如下图:
2.68
int lower_one_mask(int n) {
/*
* 题目给出了值
* 1:n = 6 得出 0x3f (0011 1111)
* 2:n =17 得出 0x1fff (0001 1111 1111 1111 1111)
* 注意: n 代表了位模式低位有多少个1
* 解题步骤如下:
* 根据返回值是int确定位模式是32;
* 取得一个全为1的位模式掩码
* 32减去n位(n表示需要保留的低位)求出需要右移的位数
*/
int w = 32; //掩码总位数32;
unsigned bit = (unsigned)-1; // 根据补码表示全为11111111...的二进制 表示-1;
return bit >> (w - n); //进行右移
}
- 输出结果如下图:
2.69
unsigned rotate_left(unsigned x, int n) {
//根据题目的规律将高位移除n位,将移除的n位变为底位
int w = 32;
int th = x << n;
int tl = x >> w - n;
return th | tl;
}
- 输出结果如下图: