题目
输入一个无符号长整数,将最高字节与最低字节互换,然后输出。
将这个长整数中间两个字节循环左移n位(n要输入),然后再输出。
将长整数按照二进制输出,每8位输出一个空格。
第一部分 最高字节与最低字节互换
一.位运算
-
& 与 两者都为1,结果才为1;
- (1).清零 a&0=0
- (2).判断某一位是否为1 10000111 & 10000000= 10000000 ; 00000111 & 10000000 = 0
- (3).取一个数字的指定位 a&0000 1111,取a都后四位 (2)(3)一个意思
- (4). (a&b)<<1 二进制加法的进位
-
| 或 两者都为0,结果才为0
- (1).对某些位设置位1 a | 0000 1111,后四位设置位1
-
^ 异或 两位相同位1,相异为1
- (1). x^x = 0, x^0 = x; a^b^b=a^0=a;
- (2).反转指定位 a^0000 1111,后四位翻转
- (3).二进制无进位相加, a^b
- (4). 交换两个数 a^=b;b^=a;a^=b;
-
~ 取反 0变1,1变0
- (1).最低位变0 a~1 111~001=110
利用了 &(3) 与 |
第二部分循环左移 (中间两个字节循环左移n位)
只有中间两个字节进行循环左移,高八位和低八位不变。
n = n % 16;
mid = num & 0x00ffff00; //截取中间两个字节
print_ul(mid);
mid >>= 8; //右移到边界
print_ul(mid);
mid <<= n; //左移 中间作为分界线,左边是循环移到右边的,右边是不变的
temp = mid & 0xffff0000 ; //分界线左边值
mid = mid & 0x0000ffff; //把左边部分去掉
temp >>= 16; // 补充到右边
mid = mid | temp; //合并
mid <<= 8 ; //移回中间
num = (num & 0xff0000ff) | mid; //把高八位低八位安装回来
/!!!注意:unsigned long和unsigned int一样只有4个字节
#include<stdio.h>
typedef unsigned long ul;
//二进制打印
void print_ul(ul num)
{
int buf[32] = {0};
ul radix = 2;
int count = 0;
do
{
buf[count++] = num % radix;
num /= radix;
}while(num);
count = 0;
for(int i = 31; i >= 0; i--)
{
printf("%d",buf[i]);
count++;
if(count%8 == 0)
printf(" ");
}
printf("\n");
}
int main()
{
//最低最高字节互换并输出
ul num, high, low, mid;
printf("请输入无符号长整数:");
scanf("%lu", &num);
//print_ul(num);
high = num << 24; //交换后的高字节
low = num >> 24; //交换后的低字节
num = num & 0x00ffff00;
num = num | high | low;
print_ul(num);
//循环左移n位
int n;
ul temp = 0;
printf("请输入移位位数n:");
scanf("%d", &n);
n = n % 16;
mid = num & 0x00ffff00;
mid = mid >> 8; //中间两个字节右移到1 2字节处
mid = mid << n; //左移n位后3 4字节为经过循环进入低字节或高字节部分
temp = (mid & 0xffff0000) >> 8;
mid = (mid & 0x0000ffff) << 8; //左移n位后1 2字节为未进入循环部分
mid = mid | temp;
num = (num & 0xff0000ff) | mid;
print_ul(num);
return 0;
}