As i understand condition
shiftval = 00001010;
startHour = -1;
endHour = -1;
iteration 1:
i = 00000000;
1 = 00000001;
0000001 = 00000001 << 0; which just means shift the 1 by zero positions to the left
0000000 = 00000001 & 00001010; this should be obvious boolean algebra
iteration 2:
i = 00000001;
1 = 00000001;
0000010 = 00000001 << 1;
0000010 = 00000010 & 00001010
first condition is true:
startHour = 0000010; // 2
endHour = 0000010; // 2
iteration3:
i = 00000010;
1 = 00000001;
0000100 = 00000001 << 2;
0000000 = 00000100 & 00001010;
second condition is true:
string buffer : "2 to 2"
startHour = -1;
endHour = -1;
iteration4:
i = 00000011;
1 = 00000001;
0001000 = 00000001 << 3;
0001000 = 00001000 & 00001010;
first condition is true:
startHour = 3;
endHour = 3;
iteration5:
i = 00000100;
1 = 00000001;
0010000 = 00000001 << 4;
0000000 = 00001000 & 00001010;
second condition is true:
stringBuffer : "4 to 4";
so what I deduce is that, this is a rather elegant mechanism to calculate ranges :)
shiftval = 00001111;
startHour = -1;
endHour = -1;
iteration1:
i = 00000000;
1 = 00000001;
0000001 = 00000001 << 0;
0000001 = 00000001 & 00001111;
first condition is true:
startHour = 1;
endHour = 1;
iteration2:
i = 00000001;
1 = 00000001;
0000010 = 00000001 << 1;
0000010 = 00000010 & 00001111;
first condition is true:
startHour = 1;
endHour = 2;
iteration3:
i = 00000010;
1 = 00000001;
0000100 = 00000001 << 2;
0000100 = 00000100 & 00001111;
first condition is true:
startHour = 1;
endHour = 3;
iteration4:
i = 00000011;
1 = 0000001;
0001000 = 00000001 << 3;
0001000 = 00001000 & 00001111;
first condition is true:
startHour = 1;
endHour = 4;
iteration5:
....
second condition is true:
stringBuffer : "1 to 4";
startHour = -1;
endHour = -1;
that's rather elegant :D I don't know if the behaviour is correct and what you need but the intention is nice :D