38 lines
		
	
	
		
			791 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			791 B
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "tommath_private.h"
 | |
| #ifdef BN_MP_CNT_LSB_C
 | |
| /* LibTomMath, multiple-precision integer library -- Tom St Denis */
 | |
| /* SPDX-License-Identifier: Unlicense */
 | |
| 
 | |
| static const int lnz[16] = {
 | |
|    4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
 | |
| };
 | |
| 
 | |
| /* Counts the number of lsbs which are zero before the first zero bit */
 | |
| int mp_cnt_lsb(const mp_int *a)
 | |
| {
 | |
|    int x;
 | |
|    mp_digit q, qq;
 | |
| 
 | |
|    /* easy out */
 | |
|    if (MP_IS_ZERO(a)) {
 | |
|       return 0;
 | |
|    }
 | |
| 
 | |
|    /* scan lower digits until non-zero */
 | |
|    for (x = 0; (x < a->used) && (a->dp[x] == 0u); x++) {}
 | |
|    q = a->dp[x];
 | |
|    x *= MP_DIGIT_BIT;
 | |
| 
 | |
|    /* now scan this digit until a 1 is found */
 | |
|    if ((q & 1u) == 0u) {
 | |
|       do {
 | |
|          qq  = q & 15u;
 | |
|          x  += lnz[qq];
 | |
|          q >>= 4;
 | |
|       } while (qq == 0u);
 | |
|    }
 | |
|    return x;
 | |
| }
 | |
| 
 | |
| #endif
 | 
