forked from XS-MLVP/UnityChipForXiangShan
96 lines
2.7 KiB
C
96 lines
2.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
void print_binary(unsigned long long n) {
|
|
if (n == 0) {
|
|
printf("0");
|
|
return;
|
|
}
|
|
char binary[65]; // 64位加一个空字符
|
|
int i = 0;
|
|
while (n > 0) {
|
|
binary[i++] = (n % 2) ? '1' : '0';
|
|
n /= 2;
|
|
}
|
|
binary[i] = '\0';
|
|
|
|
// 反转字符串以正确打印
|
|
for (int j = 0; j < i / 2; j++) {
|
|
char temp = binary[j];
|
|
binary[j] = binary[i - 1 - j];
|
|
binary[i - 1 - j] = temp;
|
|
}
|
|
printf("%s", binary);
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
// 检查参数数量是否正确
|
|
if (argc != 4) {
|
|
fprintf(stderr, "用法: %s <-l|-r> <value> <shift_bits>\n", argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
char *direction = argv[1];
|
|
char *value_str = argv[2];
|
|
char *shift_bits_str = argv[3];
|
|
|
|
unsigned long long value = 0;
|
|
unsigned int shift_bits = 0;
|
|
char prefix[3] = "";
|
|
|
|
// 尝试解析十六进制或十进制
|
|
if (sscanf(value_str, "%2s", prefix) == 1 && strcmp(prefix, "0x") == 0) {
|
|
if (sscanf(value_str, "%llx", &value) != 1) {
|
|
fprintf(stderr, "错误: 无效的十六进制数值\n");
|
|
return 1;
|
|
}
|
|
} else {
|
|
if (sscanf(value_str, "%llu", &value) != 1) {
|
|
fprintf(stderr, "错误: 无效的十进制数值\n");
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
// 解析移位位数
|
|
if (sscanf(shift_bits_str, "%u", &shift_bits) != 1) {
|
|
fprintf(stderr, "错误: 无效的移位位数\n");
|
|
return 1;
|
|
}
|
|
|
|
// 检查移位位数是否合法
|
|
if (shift_bits >= 64) {
|
|
fprintf(stderr, "错误: 移位位数必须小于64\n");
|
|
return 1;
|
|
}
|
|
|
|
unsigned long long result;
|
|
|
|
printf("原始值: 0x%llx (十进制: %llu)\n", value, value);
|
|
printf("原始值 (二进制): ");
|
|
print_binary(value);
|
|
printf("\n");
|
|
printf("移位位数: %u\n", shift_bits);
|
|
|
|
// 执行移位操作
|
|
if (strcmp(direction, "-l") == 0) {
|
|
// 左移操作 (无符号)
|
|
result = value << shift_bits;
|
|
printf("左移 %u 位后的结果: 0x%llx (十进制: %llu)\n", shift_bits, result, result);
|
|
printf("结果 (二进制): ");
|
|
print_binary(result);
|
|
printf("\n");
|
|
} else if (strcmp(direction, "-r") == 0) {
|
|
// 右移操作 (无符号)
|
|
result = value >> shift_bits;
|
|
printf("右移 %u 位后的结果: 0x%llx (十进制: %llu)\n", shift_bits, result, result);
|
|
printf("结果 (二进制): ");
|
|
print_binary(result);
|
|
printf("\n");
|
|
} else {
|
|
fprintf(stderr, "错误: 无效的移位方向,请使用 -l 或 -r\n");
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
} |