用C

2016-11-17 73 views
-4

我試圖解決以下問題打開指示燈:用C

「你必須在列0-15位表示,該行僅由兩個字節表示的LED填充的16×16格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

分享您的代碼 – eyllanesc

+0

位'i'爲'1 << i',其中'i'爲值0-7。使用按位OR鍵打開,按位XOR切換或按逆位掩碼關閉AND。 – paddy

+0

爲什麼你不搜索?本網站上的許多資源以及涵蓋C中的位操作的其他資源。 – kaylum

回答

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

謝謝,這肯定有幫助。我不知道這將如何解決16x16陣列。這不是(16^2)x1陣列嗎? – Nick

+0

這實際上是一個16x16陣列,雖然C沒有看到它那樣。您將一個16位數字視爲一個位數組。所以你有一個由16位16位數組組成的數組。您可以使用位移來處理每個位。 – Chris

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; 
+0

這有助於謝謝你!對於缺少發佈的代碼感到抱歉,這個問題對我來說更像是一個思考實驗,因爲我正準備面試。 – Nick

+0

沒有冒犯,但這是基本的東西。我認爲這是一門課程的作業。誰在招聘不懂二維數組索引和簡單數學的C程序員? – paddy

+0

對於實習,我實際上還在上學。我已經參加了幾個C班,但我從來沒有處理過按位操作,因此感到困惑。 – Nick