Velocity Reviews > How does the cycle index control the loop

# How does the cycle index control the loop

fl
Guest
Posts: n/a

 05-07-2011
Hi,

I do not understand the index variable 'j' function below. How deos j
control to end of the for loop?
It cycles 8 times from step tracking. When does j equal 0, it ends the
loop. I do not understand why it ends when j==0.

..............
for (j=0x80; j; j>>=1) {
bit = crc & crchighbit;
crc<<= 1;
if (c & j)
crc|= 1;
if (bit)
crc^= polynom;
}

fl
Guest
Posts: n/a

 05-07-2011
On 7 mai, 12:37, fl <(E-Mail Removed)> wrote:
> Hi,
>
> I do not understand the index variable 'j' function below. How deos j
> control to end of the for loop?
> It cycles 8 times from step tracking. When does j equal 0, it ends the
> loop. I do not understand why it ends when j==0.
>
>
> .............
> for (j=0x80; j; j>>=1) {
> *bit = crc & crchighbit;
> *crc<<= 1;
> *if (c & j)
> * * crc|= 1;
> *if (bit)
> * * crc^= polynom;
>
>
>
> }- Masquer le texte des messages précédents -
>
> - Afficher le texte des messages précédents -

The second item 'j' in the for loop means it is non-zero. This non-
zero as the termination criteria? Thanks.

Lew Pitcher
Guest
Posts: n/a

 05-07-2011
On May 7, 2011 12:37, in comp.lang.c, http://www.velocityreviews.com/forums/(E-Mail Removed) wrote:

> Hi,
>
> I do not understand the index variable 'j' function below. How deos j
> control to end of the for loop?
> It cycles 8 times from step tracking. When does j equal 0, it ends the
> loop. I do not understand why it ends when j==0.
>

for (j=0x80; j; j>>=1) { /* stuff */ }

as
initialize j to 0x80
while j is not zero

do some stuff

drop the low-order bit of j, shift the remaining bits right by 1 bit,
and fill in the vacated high order bit with a 0

go back to the top of the loop.

If you walk the loop through:
j is set to 0x80, j is not zero, the loop body is run, and j becomes 0x40
j is 0x40, j is not zero, the loop body is run, and j becomes 0x20
j is 0x20, j is not zero, the loop body is run, and j becomes 0x10
j is 0x10, j is not zero, the loop body is run, and j becomes 0x08
j is 0x08, j is not zero, the loop body is run, and j becomes 0x04
j is 0x04, j is not zero, the loop body is run, and j becomes 0x02
j is 0x02, j is not zero, the loop body is run, and j becomes 0x01
j is 0x01, j is not zero, the loop body is run, and j becomes 0x00
j is 0x00, j is zero, the loop terminates

That's 8 times that j is not zero, and the loop body is executed.

HTH
--
Lew Pitcher
Master Codewright & JOAT-in-training | Registered Linux User #112576
Me: http://pitcher.digitalfreehold.ca/ | Just Linux: http://justlinux.ca/
---------- Slackware - Because I know what I'm doing. ------

Kleuskes & Moos
Guest
Posts: n/a

 05-07-2011
On May 7, 6:45*pm, fl <(E-Mail Removed)> wrote:
> On 7 mai, 12:37, fl <(E-Mail Removed)> wrote:
>
>
>
>
>
>
>
>
>
> > Hi,

>
> > I do not understand the index variable 'j' function below. How deos j
> > control to end of the for loop?
> > It cycles 8 times from step tracking. When does j equal 0, it ends the
> > loop. I do not understand why it ends when j==0.

>

>
> > .............
> > for (j=0x80; j; j>>=1) {
> > *bit = crc & crchighbit;
> > *crc<<= 1;
> > *if (c & j)
> > * * crc|= 1;
> > *if (bit)
> > * * crc^= polynom;

>
> > }- Masquer le texte des messages précédents -

>
> > - Afficher le texte des messages précédents -

>
> The second item 'j' in the for loop means it is non-zero. This non-
> zero as the termination criteria? Thanks.

j <-- 0b10000000
While j is not 0 (any non-zero value i interpreted as true)
Shift j one position to the right.

The single one will then be shifted out after 8 iterations, resulting
in j=0 (i.e. false) and the loop stops.

Keith Thompson
Guest
Posts: n/a

 05-07-2011
fl <(E-Mail Removed)> writes:
> I do not understand the index variable 'j' function below. How deos j
> control to end of the for loop?
> It cycles 8 times from step tracking. When does j equal 0, it ends the
> loop. I do not understand why it ends when j==0.
>
> .............
> for (j=0x80; j; j>>=1) {
> bit = crc & crchighbit;
> crc<<= 1;
> if (c & j)
> crc|= 1;
> if (bit)
> crc^= polynom;
> }

Whenever an expression (say, "foo") appears in a context that requires a
condition (if, while, do-while, the second clause of a for loop), the
result of the expression is compared to zero, and the condition is true
if the expression is unequal to zero.

For example:

int foo = 0;
if (foo) puts("This will not be printed");
foo = 1;
if (foo) puts("This will be printed");
foo = 42;
if (foo) puts("This will also be printed");

Prior to the C99 standard, C did not have a dedicated boolean type.
Instead, any scalar (even a pointer) could be used as a condition,
with 0 meaning false and non-0 meaning true. C99 added _Bool
(and bool, if you #include <stdbool.h>), but it was merely tacked
onto the existing language; the use of arbitrary scalar values as
conditions is unchanged.

See section 9 of the comp.lang.c FAQ, <http://www.c-faq.com/>.

--
Keith Thompson (The_Other_Keith) (E-Mail Removed) <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"