C | Bellekten bit değerini okuma

TheAny

Megapat
Katılım
18 Aralık 2018
Mesajlar
7.614
Makaleler
13
Çözümler
101
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?
[CODE lang="c" title="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");
}

}[/CODE]
 
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.
 
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;
}
 
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.

[CODE lang="c" title="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);
}

[/CODE]
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:
İ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.
 
İ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.
 
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.
 
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.
 

Geri
Yukarı