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 .
bit mask konusunu araştırın.
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.
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
Ş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
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
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;
}
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.
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.
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
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..