长整数(位运算,循环移位)

该博客详细介绍了如何使用位运算来实现无符号长整数的最高字节与最低字节互换,以及中间两个字节的循环左移操作。博主首先解释了位运算的基本概念,如与(&)、或(|)、异或(^)、取反(~)等,并提供了相应的示例。接着,通过具体的步骤展示了如何仅改变中间两个字节进行循环左移,同时保持高八位和低八位不变。最后,给出了完整的C语言代码实现这一过程,并附带了二进制打印函数用于输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

输入一个无符号长整数,将最高字节与最低字节互换,然后输出。
将这个长整数中间两个字节循环左移n位(n要输入),然后再输出。
将长整数按照二进制输出,每8位输出一个空格。

第一部分 最高字节与最低字节互换

一.位运算
  1. & 与 两者都为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 二进制加法的进位
  2. | 或 两者都为0,结果才为0

    • (1).对某些位设置位1 a | 0000 1111,后四位设置位1
  3. ^ 异或 两位相同位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;
  4. ~ 取反 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值