Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: t2 - 02 Şubat 2014, 21:00:15

Başlık: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: t2 - 02 Şubat 2014, 21:00:15

Dword veya word ya da byte değişkeni binary olarak düşünelim. Bitleri şöyle olsun.

000111100001101010

Burada en soldaki 0 dan farklı bitin kaçıncı bit olduğunu tespit edebileceğimiz hazır fonksiyon var mı ? bu bit kaçıncı bit? nasıl bulunur?

Şu sayıdan büyük mü? bundan büyük mü gibi kıyaslayarak illa ki yapılabilir. en basit ve hızlı yöntemi arıyorum
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: AsHeS - 02 Şubat 2014, 21:21:49
#define check_bit32(x,y)     (x&(((uint32_t)1)<<y))?1:0

32 bitlik x sayısının y.bitini test eden makro for döngüsü ile y'yi arttırırsanız işini görür tahminimce.
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: muuzoo - 02 Şubat 2014, 21:23:22
unsigned int target,i;
unsigned int mask = 0x80000000
unsigned int temp=0;
while(!temp){
target=(target << 1);
        temp= target&mask;
++i;
}


Denemedim, ama ilk olarak aklıma bu geldi. i sayacı bir olan bitin sırasını veriyor.
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: arm-beginner - 02 Şubat 2014, 21:43:46
C++ kullanıyorsan, aynı isimli function ama farklı parametreler ile uint8_t ... uint64_t kapsıyan bir şekilde yazabilirsin.


#define BIT_IS_SET(ADDRESS, BIT)        ((ADDRESS) & (1 << (BIT)))

int GetPosition(uint16_t value)
{
  int cnt;
 
  cnt = sizeof(value) * 8;
  while(--cnt >= 0)
  {
    if (BIT_IS_SET(value, cnt))
      return cnt;
  }
  return -1;
}
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: XX_CİHAN_XX - 02 Şubat 2014, 22:30:50

uint32_t x;   //tespit etmek istediğimiz sayi degiskeni (32bit)
uint32_t m;   //mask register(32bit)
uint8_t i=0;  //0 ile 31 arası bit numarası veren indicator(8 bit)

if(x)
{
   for(i=31, m=0x8000; m>0; i--,m>>=1)
      if(m&x)
         break;
}
   
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: mufitsozen - 02 Şubat 2014, 22:59:56
// 00 0111 1000 0110 1010
unsigned int sayi=0x7d6a;

unsigned num = 0;
while (sayi >>= 1) {
    num++;
}

// num = en soldaki toplam 0 olan bit sayisi

mesaj birleştirme:: 02 Şubat 2014, 23:07:35

// 00 0111 1000 0110 1010
unsigned int sayi=0x7d6a;

unsigned num = 0;
while ((int)sayi>0) {
    sayi <<= 1;
    num++;
}
// num  0 olmayan en soldaki  bit no
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: arm-beginner - 02 Şubat 2014, 23:07:58
@mufitsozen: çok hoşuma gitti bu çözüm!
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: mufitsozen - 02 Şubat 2014, 23:27:43
bu birsey degil, ben sayin @z'nin intel 386+ icin inline assembler kullanarak BSR komutu ile yazacagi kodu bir gorun derim!  :P
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: AsHeS - 02 Şubat 2014, 23:31:48
@mufitsozen tecrübe konuşmuş resmen :)
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: muuzoo - 02 Şubat 2014, 23:39:49
@mufitsozen çok estetik bir çözüm olmuş :) ellerinize sağlık. Bu arada forum kültürünün güzelliği de karşımızda, aynı sorun için farklı çözümler olması ayrıca güzel.
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: t2 - 03 Şubat 2014, 14:29:58
Yardımlarınız için çok teşekkür ederim.

Acemiyim ve  kullandığım şeyi anlamak istiyorum. Şundan daha sade olduğunu düşünerek,
#define check_bit32(x,y)     (x&(((uint32_t)1)<<y))?1:0
Döngü içinde kullanmak üzere böyle bir şey buldum.
#define testbit(v,n) (!!((v)&1UL<<(n)))     // bit 1 mi 0 mı    
Yapılan işi anlayamadım. Çalışıp çalışmadığına da bakamadım.

&1UL ne ?
& tamam da  1UL ne ?   
!! ne ? değil değil mi demek?  ikitane değil  birbirini götürmez mi?
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: SpeedyX - 03 Şubat 2014, 18:27:28
&1UL demek 1 sayısı ile and işlemi yapmak demek, sayının da unsigned long olduğunu belirtmiş
!! ise özel bir terim, boolean değer istiyorum demek, 1 yada 0 döndür demek oluyor.
Başlık: Ynt: En soldaki 0 dan farklı biti bulacak fonksiyon?
Gönderen: t2 - 03 Şubat 2014, 18:37:49
Sağol. Bunlar saçma  diye düşünüyordum. demek ki anlamlıymış.