C | Bellekten bit değerini okuma

TheAny

Hectopat
Katılım
18 Aralık 2018
Mesajlar
2.318
Makaleler
6
Çözümler
32
C'de bitwise diye konu açmıştım, hocaya sordum. Binary olarak çıktı istiyor. Bunun için A'yı önce integera dönüştürdüm ki ASCII tablosunda ki konumunu öğreneyim. Sonrasında bu integer'ı binary'e çevirdim. Base 8 çıktısı 01000001 oluyor. Fakat bunu bellekten okumam gerekiyormuş. Bellekten okuyabilmem için kullanabileceğim herhangi bir kütüphane var mı bilmem gereken?
A to Binary:
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[]) {
    int a = 65, n, c, k;
    char b = 'A';
    printf("char is: %c ", a);
    printf("int is: %d   ", b);
    printf("binary is: ");
    for (c = 7; c >= 0; c--)
  {
    k = a >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }

}
 

Birhibile

Centipat
Katılım
26 Mart 2020
Mesajlar
331
Sorduğun soruda bir gariplik var; ya hoca bir şeyleri yanlış anlatmış ya da sen bir şeyleri yanlış anlamışsın.

Bellekten okurken zaten binary okuyorsun, donanımlar binary çalışıyor. Octal ya da hexadecimal okuyamazsın. int a = 65; dediğinde bellekte bir yerde 65'i binary olarak depoluyorsun. Daha sonra a'yı kullandığında da bellekten okumuş oluyorsun. Soruyu direkt olarak aktarırsan daha iyi yardımcı olabiliriz.
 

NeoXLR

Kilopat
Katılım
20 Şubat 2017
Mesajlar
1.492
Çözümler
30
Bir şeyi başka bir şeye dönüştürmene gerek yok zaten arka planda onların hepsi binary.

C++:
#include <stdio.h>

int main()
{
    char byte = 'A';

    for (int i = 0; i < 8; i++) {
        printf("%d", (byte & (1 << i)) != 0 );
    }
    return 0;
}
 
KS
KS
TheAny

TheAny

Hectopat
Katılım
18 Aralık 2018
Mesajlar
2.318
Makaleler
6
Çözümler
32
Sorduğun soruda bir gariplik var; ya hoca bir şeyleri yanlış anlatmış ya da sen bir şeyleri yanlış anlamışsın.

Bellekten okurken zaten binary okuyorsun, donanımlar binary çalışıyor. Octal ya da hexadecimal okuyamazsın. int a = 65; dediğinde bellekte bir yerde 65'i binary olarak depoluyorsun. Daha sonra a'yı kullandığında da bellekten okumuş oluyorsun. Soruyu direkt olarak aktarırsan daha iyi yardımcı olabiliriz.
Binary olarak depoladığımda bunu base2 bit değer olarak istemişti. Neyse buldum. itoa diye bir kod varmış. Sabahtan beri kıçımı kurtaran o.

C:
#include <stdio.h>
#include <stdint.h>
#include <limits.h>
void printbinchar(char character)
{
    char output[9];
    itoa(character, output, 2);
    printf("%s\n", output);

}
void printbinshort(short int integer)
{
   int output[9];
   itoa(167, output, 2);
   printf("%s\n", output);

}
void printbinfloat(float f) {
   int output[32];
   itoa(3.14, output, 2);
   printf("%s\n", output);

}

int main()
{
    char a = 'A';
    short int b = 167;
    float c = 3.14;
    printf("A in bitwise base 2: ");
    printbinchar(a);
    printf("167 in bitwise base 2: ");
    printbinshort(b);
    printf("3.14 in bitwise base 2: ");
    printbinfloat(c);
}
Bilmeyenler için itoa:

itoa(int value, char *str, int base) düzenine sahip. itoa'ya girilen değeri base üzerinden str olarak çıktı veriyor. Yani 65 girdiğinizde doğrudan bit olarak çıktı veriyor.
 
Son düzenleme:

NeoXLR

Kilopat
Katılım
20 Şubat 2017
Mesajlar
1.492
Çözümler
30
İtoa fonksiyonu integer value alıyor float değer girersen doğru sonucu vermez, ikinci parametreside char pointeri istiyor ancak sen bazı fonksiyonlarda int dizisi vermissin bunlarıda gözden geçirmen faydalı olur.
 
KS
KS
TheAny

TheAny

Hectopat
Katılım
18 Aralık 2018
Mesajlar
2.318
Makaleler
6
Çözümler
32
İtoa fonksiyonu integer value alıyor float değer girersen doğru sonucu vermez, ikinci parametreside char pointeri istiyor ancak sen bazı fonksiyonlarda int dizisi vermissin bunlarıda gözden geçirmen faydalı olur.
Int dizini sorun çıkartmıyor char'da da pointer değil dizin vermem yeterli oluyor. Ancak float değerde doğru sonuç vermediği doğru. Float'ta değişiklik yapmam lazım.

C:
     union {
        float f;
        uint32_t u;
    } fu = { .f = f };
    int i = sizeof f * CHAR_BIT;

    while (i--)
        printf ("%d", (fu.u >> i) & 0x1);

    putchar ('\n');

Şu daha doğru çalışacak gibi.
 

NeoXLR

Kilopat
Katılım
20 Şubat 2017
Mesajlar
1.492
Çözümler
30
Sorun çıkarmaması doğal int, float veya char hepsi aynı şekilde depolanıyor ancak doğru bir kullanım değil. Derleyicinin bu konuda bir uyarı çıkarması gerek örtük dönüşüm yapılıyor başka projelerde çalışırken sıkıntı yaşayabilirsin.
 
KS
KS
TheAny

TheAny

Hectopat
Katılım
18 Aralık 2018
Mesajlar
2.318
Makaleler
6
Çözümler
32
Sorun çıkarmaması doğal int, float veya char hepsi aynı şekilde depolanıyor ancak doğru bir kullanım değil. Derleyicinin bu konuda bir uyarı çıkarması gerek örtük dönüşüm yapılıyor başka projelerde çalışırken sıkıntı yaşayabilirsin.
Onları char'a dönüştürdüm. Float yerine de attığım kodu kullandım.
 

Yeni konular

Yukarı