我正在尝试解决以下问题:
“你有一个由LED填充的16x16网格,其中列由0-15位表示,行仅由两个字节0-1表示。编写C脚本以打开任何给定的LED。变量表示LED阵列的名称是LED [16] [2]。“
我真的不确定如何处理这个问题,因为我从来没有在代码中处理位和字节。我知道打开LED的好方法是转到我想要的特定数组索引并将其值设置为“0x01”,但我不知道如何实际索引此数组。我也知道字节通常写为“0x00,0xFF”等,但你会如何表示位?任何帮助将不胜感激。
编辑:抱歉忘记发布代码
int main() {
char LEDs[16][2];//Assuming char array since chars are 1 byte
char col, row;
printf("Enter col and row: \n");
scanf("%c %c\n", col, row);
//Turn on LED
LEDs[col][row] = 0x01;
//Turn off LED
LEDs[col][row] = 0x00;
}
答案 0 :(得分:0)
这样的事情怎么样?
uint16_t LEDs[16] //Each one is 16 bits
unsigned char row,col;
//Turn on LED
LEDs[row] |= 0x1 << col;
//Turn off LED
LEDs[row] &= ~(0x1 << col);
//Toggle LEDs
LEDs[row] ^= 0x1 << col;
您可能希望检查数字是否在正确的范围内。
答案 1 :(得分:0)
您的阵列是基于行的。也就是说,有16行,每行包含两个字节。由于列值可以是0-15,因此必须先确定它进入的两个字节中的哪一个,以及它对应的位。
也许这使得它更清晰:
col | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
-----+------------------------+-------------------------
byte | 0 0 0 0 0 0 0 0 | 1 1 1 1 1 1 1 1
bit | 0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7
这可以通过以下方式实现:
int which_byte = col / 8;
int which_bit = col % 8;
LEDS[row][which_byte] |= (1 << which_bit);
如果需要,可以使用按位运算执行除法和模运算,但这并不像上面的示例那样清晰。
int which_byte = col >> 3;
int which_bit = col & 7;