密码学之大数左移与右移
来源:互联网 发布:打开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
- 密码学之大数左移与右移
- 左移与右移
- 负数的左移与右移
- 左移(<<)与右移(>>)
- 负数的左移与右移
- 左移、右移
- 左移、右移
- 左移,右移
- 左移 & 右移
- 左移<<,右移>>
- 密码学之大数乘法
- C符号之逻辑运算符、左移与右移、自增自减
- C符号之逻辑运算符、左移与右移、…
- mysql之左连接与右连接
- mysql之左连接与右连接
- 左移 和 右移
- java 左移 右移
- 左移<<和右移
- 【Spring学习08】依赖配置:复合属性
- Java的方法和方法重载
- Freemarker判断序列中是否包含某个元素
- SQLServer2008数据迁移
- SVM (草稿运算)
- 密码学之大数左移与右移
- 电子科大CTF安全萌新赛部分WP
- 线程生命周期图解
- Bitmap 的一些小技巧
- H5里面的data属性介绍
- mysql数据库插入中文以及乱码问题解决(统一设置为utf-8)格式
- 【JVM】类加载器与双亲委派模型(一)
- Linux vpn install
- 大话设计模式-----(八)迭代器模式、单例模式