某些嵌入式平台缺乏硬體位移指令,或需在高級語言中純算術實現位移操作。本文提供基於乘除法的左移/右移函數。
// 將 n 左移 m 位(相當於 n * 2^m)
int byte_to_left_move(int n, int m) {
int i, ret = 1;
if (n == 0 || n < 0) return 0; // 異常處理
if (n == 1) {
for (i = 0; i < m; i++) ret *= n * 2; // 1 << m = 2^m
}
if (n > 1) {
for (i = 0; i < m; i++) ret *= n; // 注:此邏輯有缺陷,見下文分析
}
return ret;
}
// 將 n 右移 m 位(相當於 n / 2^m)
int byte_to_right_move(int n, int m) {
int i, ret = 1;
if (n == 0 || n < 0) return 0;
if (n == 1) ret = 0; // 1 右移任何位均為 0
if (n > 1) {
for (i = 0; i < m; i++) n /= 2;
ret = n;
}
return ret;
}
n > 1 時 ret *= n 實現的是 n^m 而非 n * 2^mint 範圍// 正確左移:乘以 2^m
int left_shift(int n, int m) {
if (m < 0) return right_shift(n, -m);
if (m >= 31) return 0; // 假設 32 位 int
return n * (1 << m); // 或 n << m(若有指令)
}
// 正確右移:除以 2^m(算術右移保持符號)
int right_shift(int n, int m) {
if (m < 0) return left_shift(n, -m);
if (m >= 31) return (n >> 31); // 全符號位
return n / (1 << m); // 或 n >> m
}
基礎算法(累乘/累加)看似簡單,實為複雜操作的基石。嵌入式開發中,理解底層運算原理、掌握無硬體指令時的軟件模擬技巧,是資深工程師的必備素養。