En soldaki 0 dan farklı biti bulacak fonksiyon?

Başlatan t2, 02 Şubat 2014, 21:00:15

t2


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

AsHeS

#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.

muuzoo

#2
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.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

arm-beginner

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;
}

XX_CİHAN_XX

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;
}
   
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

mufitsozen

#5
// 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
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

arm-beginner


mufitsozen

bu birsey degil, ben sayin @z'nin intel 386+ icin inline assembler kullanarak BSR komutu ile yazacagi kodu bir gorun derim!  :P
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

AsHeS


muuzoo

@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.
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

t2

#10
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?

SpeedyX

&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.

t2

#12
Sağol. Bunlar saçma  diye düşünüyordum. demek ki anlamlıymış.