題目描述略有混淆:16 位二進制只能表示 16 個獨立狀態(每位一燈)。若要表示 64 狀態,需 **64 位(8 字節 / uint64_t)**。文中「16 位十六進制」實指 **16 個十六進制字符 = 64 位二進制**。
#include <stdint.h>
uint64_t ledState = 0; // 64 位無符號整數,每位對應一盞燈
// 點亮第 n 盞燈 (1-64)
void ledOn(uint64_t *state, int n) {
*state |= (1ULL << (n - 1));
}
// 熄滅第 n 盞燈
void ledOff(uint64_t *state, int n) {
*state &= ~(1ULL << (n - 1));
}
// 判斷第 n 盞燈是否亮
bool ledIsOn(uint64_t state, int n) {
return (state & (1ULL << (n - 1))) != 0;
}
// 切換第 n 盞燈
void ledToggle(uint64_t *state, int n) {
*state ^= (1ULL << (n - 1));
}
| 十六進制 | 二進制(低16位) | 含義 |
|---|---|---|
| 0x8000 0000 0000 0000 | 1000 0000 0000 0000 | 第 1 燈亮 (最高位) |
| 0x4000 0000 0000 0000 | 0100 0000 0000 0000 | 第 2 燈亮 |
| 0xF000 0000 0000 0000 | 1111 0000 0000 0000 | 第 1-4 燈亮 |
| 0x0F00 0000 0000 0000 | 0000 1111 0000 0000 | 第 5-8 燈亮 |
注意:十六進制每字符 4 位,16 字符 = 64 位。高位在左對應低序號燈,視具體映射約定而定。
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
bool checkLed(uint64_t state, int ledNum) {
if (ledNum < 1 || ledNum > 64) return false;
return (state & (1ULL << (ledNum - 1))) != 0;
}
int main() {
uint64_t state = 0x0F00000000000000ULL; // 第 5-8 燈亮
printf("LED 5: %s\n", checkLed(state, 5) ? "ON" : "OFF"); // ON
printf("LED 1: %s\n", checkLed(state, 1) ? "ON" : "OFF"); // OFF
return 0;
}
uint64_t 存 64 狀態,位操作 | & ^ ~ << 完成增刪改查。0xF = 4 位全 1。1ULL << (n-1) 是核心,ULL 防止 32 位溢出。