Вопросы без ответов
В первой половине заданий необходимо определить значения переменных после выполнения поразрядных операций. Учтите, что заданные маски соответствуют восьмеричным или шестнадцатеричным цифрам.
//------------------------------------------------------bk48-06.cpp
int i,j; long l; char c; double d;
// Примечание: - sizeof(int) равен 2
// - sizeof(long) равен 4
// - "~" - операция побитовой инверсии
//------------------------------------------------ 1
i = 0x5678;
l = (i & ~0x00F0) | 0x0010;
c = (l >> 4) & 0xF + '0';
j = (i & 0xFF0F) | (~i & 0x00F0);
//------------------------------------------------ 2
i = 1; j = 2; c = 3;
l = (j > i) + (j==c) << 1 + (i !=c) << 2;
//------------------------------------------------ 3
for (l=1,i=0; l > 0; l<<=1, i++);
//------------------------------------------------ 4
for (l=1,i=0; l !=0; l<<=1, i++);
//------------------------------------------------ 5
i = 1; j = 3; c = 2;
l = i + (j << 4) + (c << 8 );
c = i << 8;
j = j << j;
//------------------------------------------------ 6
int F6(long n)
{ int i,s;
for (i=0,s=0; i < sizeof(long) * 8; i++)
{ if (n & 1) s++; n >>=1; }
return s; }
//------------------------------------------------ 7
long F7(long n)
{ int i; long s;
for (i=s=0; i < sizeof(long) * 8; i++)
{ s <<=1; s |= n & 1; n >>=1; }
return s; }
//------------------------------------------------ 8
long F8(long n, int m1, int m2)
{ long s,x; int i;
for (i=0,x=1,s=n; i < sizeof(long)*8; i++)
{ if (i >=m1 && i <=m2) s |= x; x <<=1; }
return s; }
//------------------------------------------------ 9
int F9(char c[])
{ int i,s;
for (i=0; c[i] !='\0'; i++)
if (c[i] >='0' && c[i] <='7') break;
for (s=0; c[i] >='0' && c[i] <='7'; i++)
{ s <<=3; s |= c[i] & 0x7; }
return s; }
//------------------------------------------------ 10
void F10(char c[],long n)
{ int i;
i=sizeof(long)*8/3 +1;
for (c[i--]='\0'; i>=0; i--)
{ c[i] = n & 0x7 + '0'; n >>=3; }
}
//------------------------------------------------ 11
// Операция "^" - ИСКЛЮЧАЮЩЕЕ ИЛИ
int F11(long n)
{ int i,m,k;
for (i=m=k=0; i < sizeof(long) * 8; i++, n >>= 1)
if ((n & 1) ^ m)
{ k++; m =!m; }
return k; }
//------------------------------------------------ 12
int F12(long n)
{ int i,m,k;
for (i=m=k=0; i < sizeof(long) * 8; i++, n >>= 1)
if (n & 1)
k++;
else
{ if (k > m) m=k; k=0; }
return m; }