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

题目

输入一个无符号长整数,将最高字节与最低字节互换,然后输出。
将这个长整数中间两个字节循环左移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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ccsk循环移位可以通过位运算来实现。具体来说,可以使用左移运算符和按位或运算符来实现。例如,将一个32位的整数x循环左移n位,可以使用以下代码: unsigned int ccsk_circular_shift_left(unsigned int x, int n) { return (x << n) | (x >> (32 - n)); } 其中,x << n表示将x左移n位,x >> (32 - n)表示将x右移32-n位,然后将两个结果通过按位或运算符|合并起来,即可得到循环左移n位后的结果。 ### 回答2: ccsk循环移位是一种将一个二进制数字循环左移k位的操作方法。其中c代表要移动的数字,s代表要移动的位数,k代表循环移位的次数。这种操作可以通过一系列的逻辑运算来实现。 具体步骤如下: 1. 将c的二进制表示左移s位得到c',同时c右移(32-s)位得到c''。 2. 将c''与c'进行按位或运算,得到新的c'''。 3. 将c'''与右移s位得到的掩码进行按位与运算,得到移动前后最高s位不变的c''''。 4. 将c与掩码进行按位与运算,得到c的低位。 5. 将c''''与低位进行按位或运算,得到最终的结果。 这个方法实现了ccsk循环移位的功能。通过移位和按位运算,我们可以将数字循环左移指定的位数,实现位置的循环更新。在循环移位后,原数字的最高位将出现在最低位,形成循环,而其他位则根据移动的位数进行相应的变化。 总之,ccsk循环移位是通过左移、右移和按位运算等操作实现的,它可以有效地实现数字的循环左移,从而满足不同应用场景对数字位移的需求。 ### 回答3: ccsk循环移位是一种密码学中的操作,它可以对字节块进行位移和循环。该操作是由四个参数决定的:c,s,n和k。下面是对ccsk循环移位的实现方法的解释: 首先,ccsk循环移位需要一个字节块作为输入。字节块是一个由8个字节组成的数据结构,可以看作是一个64位度的二进制数。 ccsk循环移位操作的第一个参数c用于指定字节块的循环位移方向,c = 'L'表示向左循环位移,c = 'R'表示向右循环位移。 第二个参数s用于指定字节块的循环位移的位数,s的取值范围是1到7。 第三个参数n用于指定循环移位的轮数,n的取值范围是1到16。 最后一个参数k用于指定字节块中哪些位需要进行循环移位,k的取值范围是0到7。 接下来,实现ccsk循环移位的步骤如下: 1. 首先,根据参数c和s,将字节块中的位进行循环位移。如果c = 'L',则向左循环位移s位;如果c = 'R',则向右循环位移s位。 2. 然后,根据参数n,将循环位移后的字节块再次进行位移,位移的位数为s的值。将这一步的结果作为上一步的输入,重复执行n次,直到达到指定的循环次数。 3. 最后,根据参数k,将字节块中的指定位置进行位移。如果k = 0,则不进行任何位移;如果k = 1,则右移一位;如果k = 2,则右移两位;以此类推,直到k = 7。 通过以上步骤的循环迭代,即可实现ccsk循环移位。该操作在密码学中有着广泛的应用,可以用于提高数据的安全性和加密效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值