2013-12-03 2 views
0

так что я не мог получить результаты, получая так, чтобы кто-нибудь мог объяснить, что происходит, и что мне нужно исправить здесь. так что цель состоит в том, что я смещаться (I) 1 бит в то время, пока р & I = J, который должен выглядеть в двоичномбит смещения и странный вывод

101011100 & 1 != 100 
101011100 & 10 != 100 
101011100 & 100 != 100 //true 

, но я не получаю я прыгать мимо р и вращается поз и нег каждый другой номер вот мой код:

int i=1; 
int p= // some memmory addres for this case lets just say p = 101011100 
int j=1; 
while(p&i != 1<j){ 

i=i+(i<1); 
printf("i:%d\n",i); 
} 
+0

Почему вы использовали 'j <3' в состоянии? –

+0

У меня есть noooo, чтобы понять, что эта петля пытается выполнить. 'i = 1' навсегда! –

+2

Операторы сдвига - '>>' и '<<' (двойные угловые скобки). –

ответ

0

для проверки состояния p&i!=j, код я хотел бы предложить:

int i=1; 
int p = //binary 
int j = 4; 
while((p&i)!=j) 
{ 
    i = i<<1; 
    printf("i: %d\n",i); 
    //Alter j value if needed 
}   

И в соответствии с примером, если значение j равно 100. Таким образом, я предпочитаю j быть 4 в таком случае, что десятичный эквивалент 100 равен 4.

+0

Остерегайтесь приоритета '&' vs. '= = '. Вы, безусловно, не хотите '(p & i! = J)'. Вы, скорее всего, хотите '((p & i)! = J)'. –

+0

ya but i << не работает для меня, я должен был сделать i = (i + (i << 1)), я получаю, что он равен десятичной цифре 4, но когда я распечатываю его как 18020304, тогда следующее число равно -21939402 и повторяет, что – user1547386

+0

@ user1547386: Это потому, что число выходит за пределы диапазона int –

0

Вы можете ввести код в шестнадцатеричном формате или в двоичном формате, например:

#include <stdio.h> 

static void print_binary(unsigned short x) 
{ 
    for (int b = 32768; b != 0; b /= 2) 
    { 
     printf("%d", (b & x) != 0); 
     x &= ~b; 
    } 
} 

static unsigned short scan_binary(char const *binary) 
{ 
    unsigned short u = 0; 
    char c; 
    while ((c = *binary++) != '\0') 
    { 
     /* GIGO: if it isn't a '0' or a '1', you get what you deserve! */ 
     u = (u << 1) | (c - '0'); 
    } 
    return u; 
} 

int main(void) 
{ 
    /* Working in hex - simpler */ 
    int p = 0x15C; 
    for (int i = 0; i < 16; i++) 
    { 
     if ((p & (1 << i)) == 0x04) 
      printf("Shift %d yields 0x%.4X from 0x%.4X and 0x%.4X\n", 
        i, (p & (1 << i)), p, (1 << i)); 
    } 

    /* Working in binary - harder */ 
    char b1[] = "101011100"; 
    char b2[] = "100"; 
    unsigned u1 = scan_binary(b1); 
    unsigned u2 = scan_binary(b2); 
    for (int i = 0; i < 16; i++) 
    { 
     if ((u1 & (1 << i)) == u2) 
     { 
      printf("Shift %d yields ", i); 
      print_binary(p & (1 << i)); 
      printf(" from "); 
      print_binary(u1); 
      printf(" and "); 
      print_binary(1 << i); 
      putchar('\n'); 
     } 
    } 

    return 0; 
} 

Выход:

Shift 2 yields 0x0004 from 0x015C and 0x0004 
Shift 2 yields 0000000000000100 from 0000000101011100 and 0000000000000100 

Одной из причин не использовать двоичный файл является то, что она производит очень длинные строки цифр.

Смежные вопросы