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
#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.
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.
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;
}
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;
}
// 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
@mufitsozen: çok hoşuma gitti bu çözüm!
bu birsey degil, ben sayin @z'nin intel 386+ icin inline assembler kullanarak BSR komutu ile yazacagi kodu bir gorun derim! :P
@mufitsozen tecrübe konuşmuş resmen :)
@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.
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?
&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.
Sağol. Bunlar saçma diye düşünüyordum. demek ki anlamlıymış.