密码学之大数左移与右移

来源:互联网 发布:打开xlsx文件的软件 编辑:程序博客网 时间:2024/06/04 18:59

大数左/右移:大数每个位上的数字的二进制的后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个比特位上有没有1ch = ((ch<<1)&0xf)|1;elsech <<= 1;return ch;}//右移一位char BitShiftRight(char ch){//对最后4个比特往后移一位if (ch&1)//判断str[i]最后最后一位是否为1ch = (ch>>1)|8; elsech >>= 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;  }  


附上其他大数运算:

大数加法:点击打开链接

大数减法:点击打开链接

大数乘法:点击打开链接







0 0
原创粉丝点击