大数左/右移:大数每个位上的数字的二进制的后4位进行旋转左移或右移(即专注于16进制).
大数的每一位的二进制的后四位进行移位
原理:
1,首先建立一个表格,建立数字与字符之间的对应表char table[16]="0123456789abcdef";
2,遍历大数字符串,将字符表示的16进制数转化为对应的数字
3,对每一个数字的二进制的后四位进行旋转移1位。
4,对于左移,注意倒数第四位上的数字是否为1。对于右移,注意倒数第一位上的数字是否为1.
5,将移位完成后的数字与table表对应,转化为字符。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#define LEFT 1
#define RIGHT 0
//左移一位
char BitShiftLeft(char ch)
{
//对最后4个比特往前移一位
if (ch >= 8)//表示在倒数第4个比特位上有没有1
ch = ((ch<<1)&0xf)|1;
else
ch <<= 1;
return ch;
}
//右移一位
char BitShiftRight(char ch)
{
//对最后4个比特往后移一位
if (ch&1)//判断str[i]最后最后一位是否为1
ch = (ch>>1)|8;
else
ch >>= 1;
return ch;
}
//将字符表示的16进制数转化为对应的数字
char ChangeDigit(char ch)
{
if ((ch >= '0') && (ch <= '9'))//如果是'0'~'9'
ch -= '0';
else if ((ch >= 'a') && (ch <= 'f'))//16进制字母'a'~'f'
ch = ch - 'a' + 10;
else
{
printf("输入非法字符\n");
exit(1);
}
return ch;
}
//大数移位
char* BigNumShift(char* str, int direct)//direct=1表示左移,0表示右移
{
int len = 0;
int i = 0;
char* table = "0123456789abcdef";//辅助数组
assert(str);
len = strlen(str);
for (i = 0; i < len; ++i)
{
//16进制字符转化为数字
str[i] = ChangeDigit(str[i]);
//核心代码
if (direct == LEFT) //左移
str[i] = BitShiftLeft(str[i]);
else //右移
str[i] = BitShiftRight(str[i]);
str[i] = table[str[i]];//直接赋上对应字符
}
return str;
}
void test()
{
//默认输入16进制
char str[1024] = {0};//存储number
printf("输入number:");
scanf("%s", str);
//大数左移
BigNumShift(str, LEFT);
//输出结果
printf("result = %s\n", str);
//大数右移
BigNumShift(str, RIGHT);
//输出结果
printf("result = %s\n", str);
}
int main()
{
do{
test();
getchar();
printf("输入ctrl+z结束输入,输入Enter键继续。。。\n");
}while (getchar() != EOF);
return 0;
}
附上其他大数运算:
大数加法:点击打开链接
大数减法:点击打开链接
大数乘法:点击打开链接