Conta bit pari ad 1 in una Word

Si chiede di costruire una funzione in grado di contare quanti bit di una Word si trovano a 1 (l’output della funzione è un intero).

Possiamo procedere in due modi:

Nel primo viene utilizzato il costrutto AT (che consente di poter accedere ai singoli bit della variabile word con un array di bool), e quindi la funzione sarà:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
FUNCTION "Conta_Bit_SCL_func_1" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      word_input : Word;
   END_VAR
 
   VAR_OUTPUT 
      conteggio : Int;
      word_output : Word;
   END_VAR
 
   VAR_TEMP 
      count_int : Int;
      word_in2 : Word;
      word_in_array AT word_in2 : Array[0..15] of Bool;
      word_tmp : Word;
   END_VAR
 
BEGIN
	#word_in2 := #word_input;
	#conteggio := 0;
	#word_output := 0;
 
	FOR #count_int := 0 TO 15 DO
	    IF #word_in_array[#count_int] = 1 THEN
	        #conteggio := #conteggio + 1;
	        #word_output := #word_output + 1;
	    END_IF;
	END_FOR;
 
END_FUNCTION

Nel secondo caso invece si copia la word in ingresso in una word temporanea e si effettua uno SHR (shift right) per 15 volte con un ciclo for, andando ogni volta a verificare il primo bit (#word_tmp.%X0) e ad incrementare la variabile “#conteggio” qualora il bit fosse pari ad 1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
FUNCTION "Conta_Bit_SCL_func_2" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      word_input : Word;
   END_VAR
 
   VAR_OUTPUT 
      conteggio : Int;
      word_output : Word;
   END_VAR
 
   VAR_TEMP 
      count_int : Int;
      word_tmp : Word;
   END_VAR
 
 
BEGIN
 
 
	#conteggio := 0;
	#word_output := 0;
	#word_tmp:=#word_input;
 
	FOR #count_int:=0 TO 15 DO
	    IF #word_tmp.%X0 = 1 THEN
	        #conteggio := #conteggio + 1;
	        #word_output := #word_output + 1;
	    END_IF;
	    #word_tmp:=SHR(IN:=#word_tmp, N:=1);
	END_FOR;
 
END_FUNCTION

Quindi per capire meglio si ha:
quando count=0 –> word_tmp.%X0=word_input.X0
quando count=1 –> word_tmp.%X0=word_input.X1
quando count=2 –> word_tmp.%X0=word_input.X2
….
quando count=15 –> word_tmp.%X0=word_input.X15

You may also like...


Warning: count(): Parameter must be an array or an object that implements Countable in /membri/fabioplc/wp-includes/class-wp-comment-query.php on line 399
Menu Title