UnityChipForXiangShan/shift.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;
}