8 bit lik bir sayıyı bit bit incelemek

Başlatan universitelim54, 09 Mayıs 2019, 12:46:08

universitelim54

Mrb. arkadaşlar . int türünde sayac değişkenim var bunu bit bit incelemem gerekiyor . örnek olarak 0xb001100 sayısının 2. ve 3 bitlerinin degerini almam gerekiyor. nasıl bir döngü kurmalayım bu konuda yardımınızı rica ederim .

sımışka


cripple

#2
unsigned char A; //(unsigned char = 8 bit) siz her ne kullanıyorsanız

for(uint8_t bit=0; bit < 8; bit++){
        
    if (((A>> bit) & 1) != 0){     // bit degeri 0 dan farkli mi
            
    }
    else{
    
    }
}

tam olarak kodu böyle doğrudan balık vermiş oldum ama balık tutma kısmını mutlaka inceleyin
değişken 8 defa yani tüm bitleri tek tek kaydırılarak 1 ile "ve"(&)  operatör işlemine tabi tutulur ve 0 dan farklı mı diye bakılır.

yas

Hangi bitin 1 olduğunu anlamak için değişkeni sadece 1 bitin high olguğu sayılarla and işlemine tabi tutarsın işlemin sonucu and işlemi yaptığın sayıya eşitse bit 1 değerini almıştır.
Örneğin;

IF Sayac and 8 = 8 then
üçüncü bit high dır
else
üçüncü bit low dur
Endif

0. bit için 1 ile
1. bit için 2 ile
2. bit için 4 ile
3. bit için 8 ile
4. bit için 16 ile
5. bit için 32 ile
6. bit için 64 ile
7. bit için 128 ile
....... gibi uzar gider

Murat Mert

Şunlara bir bak işini görör gibi.
#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011
mert07

universitelim54

#5
Alıntı yapılan: Murat Mert - 09 Mayıs 2019, 16:14:24Şunlara bir bak işini görör gibi.
#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011
Truestudio C++ da set bit ve clearbit fonksiyonları yoktur. Verdiğin bilgi mutlaka Baska arkadaşlarında işine yarayacaktır. Tşk ederim cevap için

Cemre.

Bu da farklı bir yöntem;
Denemek için --> https://onlinegdb.com/S17g9tf2V
typedef struct{
    unsigned char Bit0:1;
    unsigned char Bit1:1;
    unsigned char Bit2:1;
    unsigned char Bit3:1;
    unsigned char Bit4:1;
    unsigned char Bit5:1;
    unsigned char Bit6:1;
    unsigned char Bit7:1;
} Bits_TypeDef;

typedef union{
    unsigned char   Byte;
    Bits_TypeDef    Bits;
} Byte_TypeDef;

Byte_TypeDef x;

int main()
{
    x.Byte = 0xAA;

    printf("%i, %i, %i, %i, %i, %i, %i, %i", x.Bits.Bit0, x.Bits.Bit1, x.Bits.Bit2, x.Bits.Bit3,
                                            x.Bits.Bit4, x.Bits.Bit5, x.Bits.Bit6, x.Bits.Bit7);
    return 0;
}

ahuramazda

Alıntı yapılan: universitelim54 - 09 Mayıs 2019, 20:31:27Truestudio C++ da set bit ve clearbit fonksiyonları yoktur. Verdiğin bilgi mutlaka Baska arkadaşlarında işine yarayacaktır. Tşk ederim cevap için


Murat mert kendi makrolarını yazmış zaten. Truestudio'da bu fonksiyonların olup olmaması bu durumu değiştirmez ki.

MrDarK

Alıntı yapılan: Murat Mert - 09 Mayıs 2019, 16:14:24Şunlara bir bak işini görör gibi.
#define BitVal(data,y) ( (data>>y) & 1)      /** Return Data.Y value   **/
#define SetBit(data,y)    data |= (1 << y)    /** Set Data.Y   to 1    **/
#define ClearBit(data,y)  data &= ~(1 << y)   /** Clear Data.Y to 0    **/
#define TogleBit(data,y)     (data ^=BitVal(y))     /** Togle Data.Y  value  **/
#define Togle(data)   (data =~data )         /** Togle Data value     **/
örnekler:
uint8_t number = 0x05; //0b00000101
uint8_t bit_2 = BitVal(number,2); // bit_2 = 1
uint8_t bit_1 = BitVal(number,1); // bit_1 = 0

SetBit(number,1); // number =  0x07 => 0b00000111
ClearBit(number,2); // number =0x03 => 0b0000011

Hocam değerli yanıtınız için teşekkürler. Kesinlikle doğru ifadeler bunlar. Temel c ve universal. Daha detaylı anlamak için bitwise ünitelerini araştırabilir arkadaşlar. Embedded sistemlerde sürekli bitwise işlemleri kullanılıyor.
Picproje Eğitim Gönüllüleri ~ MrDarK

MCansız

    örnek olarak;


struct    bytex
            {
              unsigned int bit_0 : 1;        // Byte 1, Bit 0
              unsigned int bit_1 : 1;        // Byte 1, Bit 1
              unsigned int bit_2 : 1;        // Byte 1, Bit 2
              unsigned int bit_3 : 1;        // Byte 1, Bit 3
              unsigned int bit_4 : 1;        // Byte 1, Bit 4
              unsigned int bit_5 : 1;        // Byte 1, Bit 5
              unsigned int bit_6 : 1;        // Byte 1, Bit 6
              unsigned int bit_7 : 1;        // Byte 1, Bit 7
              unsigned int bit_8 : 1;        // Byte 0, Bit 0
              unsigned int bit_9 : 1;        // Byte 0, Bit 1
              unsigned int bit_10: 1;        // Byte 0, Bit 2
              unsigned int bit_11: 1;        // Byte 0, Bit 3
              unsigned int bit_12: 1;        // Byte 0, Bit 4
              unsigned int bit_13: 1;        // Byte 0, Bit 5
              unsigned int bit_14: 1;        // Byte 0, Bit 6
              unsigned int bit_15: 1;        // Byte 0, Bit 7
          };

union
{
struct  bytex byte;
char low_higt[2];
int all;
}gpiox;


kullanımı


gpiox altında all isminde int tipi değişkenimiz var bu değişkenin
gpiox.low_higt[0]=> low nibble (ilk 8 bit)[/li][/list]
gpiox.low_higt[1]=> high nibble (son 8 bit)  olur.
gpiox.byte.bit_15  all değişkenini 15. bitini gösterir ve değiştirebilirsiniz.


örnek:

gpiox.low_higt[0]=0x1F;
gpiox.low_higt[1]=0x2A;
değerleri verilirse
gpiox.all=0x2A1F  olur



universitelim54

Alıntı yapılan: ahuramazda - 10 Mayıs 2019, 08:49:44Murat mert kendi makrolarını yazmış zaten. Truestudio'da bu fonksiyonların olup olmaması bu durumu değiştirmez ki.

Özür diliyorum kodu anlamamışım . haklısın kendi makrosunu yapmıs..