临时存储

This commit is contained in:
zcy
2025-09-08 15:35:28 +08:00
parent 98d411d70d
commit b41fff9d09
3 changed files with 61 additions and 56 deletions

View File

@@ -57,8 +57,10 @@ public final class Zuc256Util {
public static void add31(short a_lo, short a_hi, short b_lo, short b_hi, short[] out /* len==2 */) {
// ---- 低16位相加 ----
short lo = (short)(a_lo + b_lo);
short carry = (short)(((lo & 0xFFFF) < (a_lo & 0xFFFF)) ? 1 : 0);
short carry = (short)(
( ( (short)( (a_lo & b_lo) | ((a_lo | b_lo) & (short)~lo) ) ) & (short)0x8000 ) != 0
? 1 : 0
);
// ---- 高15位相加 + 进位 ----
short hi_raw = (short)((short)((a_hi & 0x7FFF) + (b_hi & 0x7FFF)) + carry);
@@ -147,15 +149,15 @@ public final class Zuc256Util {
hi = (short)(a_hi << k);
// 把溢出部分拼接
lo |= (short)((a_hi & 0xFFFF) >>> (16 - k));
hi |= (short)((a_lo & 0xFFFF) >>> (16 - k));
lo |= (short)((a_hi & (short)0xFFFF) >>> (16 - k));
hi |= (short)((a_lo & (short)0xFFFF) >>> (16 - k));
} else {
short s = (short)(k - 16);
lo = (short)(a_hi << s);
hi = (short)(a_lo << s);
lo |= (short)((a_lo & 0xFFFF) >>> (16 - s));
hi |= (short)((a_hi & 0xFFFF) >>> (16 - s));
lo |= (short)((a_lo & (short)0xFFFF) >>> (16 - s));
hi |= (short)((a_hi & (short)0xFFFF) >>> (16 - s));
}
out[0] = lo;
@@ -271,7 +273,7 @@ public final class Zuc256Util {
out[0] = (short)((b2 << 8) | b3);
// hi = 高15位丢弃 bit31
out[1] = (short)(((b0 & 0x7F) << 8) | b1);
out[1] = (short)((b0 << 7) | b1);
}
@@ -367,14 +369,14 @@ public final class Zuc256Util {
// 低 16 位相加
short lo = (short)(a_lo + b_lo);
// 判断低 16 位是否溢出
short carry_lo = (short)(((a_lo & 0xFFFF) + (b_lo & 0xFFFF)) >>> 16);
short carry_lo = (short)(((a_lo & (short)0xFFFF) + (b_lo & (short)0xFFFF)) >>> 16);
// 高 16 位相加 + 低位进位
short hi_tmp = (short)(a_hi + b_hi);
short carry_hi1 = (short)(((a_hi & 0xFFFF) + (b_hi & 0xFFFF)) >>> 16);
short carry_hi1 = (short)(((a_hi & (short)0xFFFF) + (b_hi & (short)0xFFFF)) >>> 16);
short hi = (short)(hi_tmp + carry_lo);
short carry_hi2 = (short)(((hi_tmp & 0xFFFF) + (carry_lo & 0xFFFF)) >>> 16);
short carry_hi2 = (short)(((hi_tmp & (short)0xFFFF) + (carry_lo & (short)0xFFFF)) >>> 16);
// 输出结果
out[0] = lo;
@@ -398,7 +400,7 @@ public final class Zuc256Util {
a[1] = tmp[1];
// 高 32 位 + carry
add32((short)(a[2] + (carry & 0xFFFF)), a[3], b[2], b[3], tmp);
add32((short)(a[2] + (carry & (short)0xFFFF)), a[3], b[2], b[3], tmp);
a[2] = tmp[0];
a[3] = tmp[1];
}
@@ -429,9 +431,9 @@ public final class Zuc256Util {
// lo << k
a[0] = (short)(b[0] << k);
// hi << k, 以及 lo >>> (16-k) 进位
a[1] = (short)((b[1] << k) | ((b[0] & 0xFFFF) >>> (16 - k)));
a[1] = (short)((b[1] << k) | ((b[0] & (short)0xFFFF) >>> (16 - k)));
// hi >>> (16-k) 残留进到 a[2]
a[2] = (short)((b[1] & 0xFFFF) >>> (16 - k));
a[2] = (short)((b[1] & (short)0xFFFF) >>> (16 - k));
return;
}
@@ -444,8 +446,8 @@ public final class Zuc256Util {
// 16 < k < 32
short kk = (short)(k - 16);
a[1] = (short)(b[0] << kk);
a[2] = (short)((b[1] << kk) | ((b[0] & 0xFFFF) >>> (16 - kk)));
a[3] = (short)((b[1] & 0xFFFF) >>> (16 - kk));
a[2] = (short)((b[1] << kk) | ((b[0] & (short)0xFFFF) >>> (16 - kk)));
a[3] = (short)((b[1] & (short)0xFFFF) >>> (16 - kk));
}
/**
@@ -474,14 +476,14 @@ public final class Zuc256Util {
out[3] = 0; // 高位补0
// 再右移 15 位
short c0 = (short)((out[0] & 0xFFFF) >>> 15); // out[0] 最后一位变进位
short c1 = (short)((out[1] & 0xFFFF) >>> 15);
short c2 = (short)((out[2] & 0xFFFF) >>> 15);
short c0 = (short)((out[0] & (short)0xFFFF) >>> 15); // out[0] 最后一位变进位
short c1 = (short)((out[1] & (short)0xFFFF) >>> 15);
short c2 = (short)((out[2] & (short)0xFFFF) >>> 15);
out[0] = (short)(((out[0] & 0xFFFF) >>> 15) | (out[1] << 1));
out[1] = (short)(((out[1] & 0xFFFF) >>> 15) | (out[2] << 1));
out[2] = (short)(((out[2] & 0xFFFF) >>> 15) | (out[3] << 1));
out[3] = (short)((out[3] & 0xFFFF) >>> 15);
out[0] = (short)(((out[0] & (short)0xFFFF) >>> 15) | (out[1] << 1));
out[1] = (short)(((out[1] & (short)0xFFFF) >>> 15) | (out[2] << 1));
out[2] = (short)(((out[2] & (short)0xFFFF) >>> 15) | (out[3] << 1));
out[3] = (short)((out[3] & (short)0xFFFF) >>> 15);
}
/**
@@ -491,8 +493,8 @@ public final class Zuc256Util {
*/
static void shr32u1(short lo, short hi, short[] out) {
// >>>1先处理低16位
short newLo = (short)(((lo & 0xFFFF) >>> 1) | ((hi & 0x0001) << 15));
short newHi = (short)((hi & 0xFFFF) >>> 1);
short newLo = (short)(((lo & (short)0xFFFF) >>> 1) | ((hi & 0x0001) << 15));
short newHi = (short)((hi & (short)0xFFFF) >>> 1);
out[0] = newLo;
out[1] = newHi;