2017-05-12 5 views
0

ラズベリーパイのGPIOの入力をintに変換しようとしています。 私は5つのデジタル入力があり、入力を読みたいと思っています。値を取得したら配列に格納します。次は、配列の内容をint型に変換することです。バイナリ信号を整数に変換する

だからここに私のコードです:

int a = digitalRead(PIN_16); 
int b = digitalRead(PIN_18); 
int c = digitalRead(PIN_22); 
int d = digitalRead(PIN_24); 
int e = digitalRead(PIN_26); 

int array[5]; 

array[0]=a; 
array[1]=b; 
array[2]=c; 
array[3]=d; 
array[4]=e; 

他のその1 I 1、場合最初の入力が1または0の場合の条件を参照してください場合、私はyouseう数に配列の内容を変換するには0など。

私の質問は、これを行うより洗練された方法がある場合です。数の適切な位置に

+1

数は何をすべきですか? (例えば、pin16がハイの場合は何番になるべきですか) – Lanting

+0

それぞれの値を2の累乗で掛け合わせ(または異なる量だけ左シフト)、それらを一緒に加算します(あるいは、ビット単位またはビット単位) 。たとえば、 'value =(a << 0)| (b << 1)| (c << 2)| (d << 3)| (e << 4); –

答えて

2

だけ「シフト」ビット:これは場合digitalReadで動作する

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= a[i] << i; 
} 

のみ0又は1を返しています。

unsigned int number = 0; 
for (int i=0; i<5; i++) 
{ 
    number |= (a[i] != 0) << i; // (a[i] != 0) will have a value of `1` for any non-zero `a[i]` 
} 

またはそれ以上慣用トリック:

number |= !!a[i] << i; 

これは二重の論理否定である場合には、それは我々が代わりにゼロに対してそれをチェックする必要があります0またはnon-zero値を返します。最初のものは0以外の値を0に、2番目の値は01に変えます。あなたはビット演算でそれを行うことができます

+0

これは、ピンがハイのときに 'digitalRead'が1を返す場合にのみ有効です。私は 'digitalRead'がすでにビットセットを返す実装を見てきました。あなたは' digitalRead(PIN1 | PIN2 | PIN5); 'のような関数を呼び出すことができ、' return〜0;ピンが高いです... – Lanting

+0

@ Lantingええ、それは私の前提でした。これに対処するためにもう少し追加します。 @EugeneSh。 –

+0

。ラズベリーで機能してくれてありがとうございました。ちょうど情報のために:wiringpi.hのdigitalread()関数は0または1を返します。 – user3794592

0

result = array[4]<<4 | array[3]<<3 | array[2]<<2 | array[1]<<1 | array[0] 
関連する問題