首先介绍几个简单的大整数逻辑判断函数——比较两个大整数的大小,判断大整数是否为奇数,判断大整数是否为零,判断大数的某一位是否为0或者1。
最简单最常用的大整数比较函数为:
───────────────────────────────────────
int BN_cmp(const BIGNUM *a, const BIGNUM *b)
功能: 比较两个大整数大小
输入: a,b
输出: -
返回: 1【a大】或者0【相等】或者-1【b大】
出处: bn_lib.c
───────────────────────────────────────
上面介绍的大整数比较是要考虑符号的,如果不考虑符号的话,即只比较两个大整数的绝对值大小,就需要用到下面这个函数:
───────────────────────────────────────
int BN_ucmp(const BIGNUM *a, const BIGNUM *b)
功能: 比较两个大整数绝对值的大小
输入: a,b
输出: -
返回: 正数【a大】或者0【相等】或者 负数【b大】
出处: bn_lib.c
───────────────────────────────────────
如果要判断一个大整数是否为零,需要用到:
───────────────────────────────────────
功能: 判断大整数是否为零
输入: a
输出: -
返回: 0 【a≠0】或者 1【a=0】
出处: bn.h
备注: 宏定义。#define BN_is_zero(a) ((a)→top = = 0)
───────────────────────────────────────
如果要判断一个大整数是否为奇数,需要用到:
───────────────────────────────────────
#define BN_is_odd(BIGNUM *a)
功能: 判断大整数是否为奇数
输入: a
输出: -
返回: 1【奇数】或者 0【偶数】
出处: bn.h
备注: 宏定义。#define BN_is_odd(a) (((a)->top > 0) && ((a)->d[0] & 1))
───────────────────────────────────────
关于大数的逻辑判断就暂时介绍以上这些,下面看看大整数的逻辑移位——向左移位和向右移位。
大整数左移函数如下:
───────────────────────────────────────
int BN_lshift(BIGNUM *r, const BIGNUM *a, int n)
功能: 大整数左移
输入: a,n【左移比特数】
输出: r ← a<<n
返回: 1【正常】or 0【出错】
出处: bn_shift.c
备注: 程序内会做必要的扩展,以保证高位信息不丢失。
───────────────────────────────────────
左移过程中可能会涉及到的大整数的扩展——如果大整数的长度不够的话就进行扩展以保证能容纳下扩展后的大整数。关于扩展请参见§0.2.5的bn_wexpand和bn_expand。
特殊地,当左移比特数n=1时,上述函数变成:
───────────────────────────────────────
int BN_lshift1(BIGNUM *r, const BIGNUM *a)
功能: 将大数左移1位
输入: a
输出: r ← a << 1
返回: 1【正常】 or 0【出错】
出处: bn_mod.c
───────────────────────────────────────
大整数右移就不会涉及扩展。
───────────────────────────────────────
int BN_rshift(BIGNUM *r, const BIGNUM *a, int n)
功能: 大整数右移
输入: a,n【右移位数】
输出: r ← a>>n
返回: 1【正常】or 0【出错】
出处: bn_shift.c
───────────────────────────────────────
特殊地,当右移比特数n=1时,上述函数变成:
───────────────────────────────────────
int BN_rshift1(BIGNUM *r, const BIGNUM *a)
功能: 将大数右移1位
输入: a
输出: r ← a >>1
返回: 1【正常】 or 0【出错】
出处: bn_shift.c
───────────────────────────────────────