2009-10-11 15 views
7

İçerisinde çift sayı verildiğinde bir mantık yazmalıyım. İkisini eşit olarak bölen en yüksek güç. Girişin% 2^n == 0 olduğu 2^n maksimum değeri nedir?En Yüksek Gücü Hesaplamak 2 Eşit Bir Sayıyı C

IE: -
Girdi dışarı çalışabilir bazı bit düzeyinde mantığı olması gibi> Çıktı

4 (0100) -> 4 

8 (1000) -> 8 

12 (1100) -> 4 

14 (1110) -> 2 

24 (11000) -> 8 

etc.... 

O görünüyor: ikili giriş bakarken, en sağdaki tek bitlik çözüm gibi görünmektedir. Bu değeri C cinsinden nasıl belirlerim? Daha kolay olabilecek başka bir çözüm var mı? kayan nokta aritmetik kullanmadan Jonathan

cevap

7

Thanks- :

((x^(x - 1)) >> 1) + 1 

basitleştirilmesi ve kenar durumlarda okuyucu için egzersizleri olarak bırakılır.

+0

X = 24 (24^23) = 24623 24623 >> 1 = 12311 12311 + 1 = 12312 yanlış birşey hesaplamak mü? –

+4

Jonathan: '^' XOR, yani '(24^23)' dır. – caf

+0

BTW, eğer x imzasız ise o zaman özel işlem gerektiren tek kenarın sıfır olduğuna inanıyorum. – caf

17

Eğer 2'ye tümleyen aritmetiği üstlenmeye istekli iseniz: Bu tür bir şey bir sürü yaparsanız

x & -x

(ya da sadece bulmak bile ilginç), kendine bir kopyasını bulmak kitap "Hacker's Delight".

düzenleme: avakar, türün imzalanmamış olması durumunda bu 2'nin tamamlayıcısına bağlı olmadığını not eder. tarafından temsil edilemez bir sonuç sonuçlanan işaretsiz tamsayı türü azaltılmış modülo çünkü can asla taşması imzasız işlenen içeren

bir hesaplama: standardın ilgili bölüm paragraf 9, §6.2.5 olduğunu numaralı, numaralı en büyük değerden daha büyük olan sayı, ortaya çıkan türüyle temsil edilebilir.

"büyük değerden daha büyük bir" (özellikle, örneğin, ikili kullanmayan bir uygulama) özellikle sapık uygulanması için bazı esneklik payı bırakır, ancak bu karşılaşmaya oldukça muhtemel.

+1

çok özlü, sevdim! –

+2

+1. Kayıt için, 2'nin tamamlayıcısını varsaymak zorunda değilsin. Bu, "x" imzasız aritmetik türden olduğu sürece, herhangi bir mimaride portably çalışır. – avakar

+2

1'in tamamlayıcı aritmetiği olan bir 32 bit türümüz varsa: eğer x 1 ise, o zaman '-x'' 0xfffffffe' ve 'x & -x' 0'dır, bu da sorgunun istediği cevap değildir. J.F. Sebastian'ın belirttiği gibi, * x * (x + (+ x + 1)) işlevini kullanarak çalışabilirsiniz, ki bu sadece 2'nin iki operasyona yayılan iltifatsızlığıdır. –

6

Biz (~x + 1) tarafından (-x) değiştirebilirsiniz:

x & (~x+1) 

Low Level Bit Hacks You Absolutely Must Know ayrıntılı açıklamasını sağlamaktadır.

+0

Not: (~ x + 1), 2'nin tamamlayıcısı olan -x'in tanımıdır. Bu, x & (-x) 'den biraz daha iyi bir cevap yapar, çünkü (~ x + 1), sadece bu günlerde verilen (ancak her zaman değil!) Düz ikili aritmetiği kullanan makineye bağlıdır. –

3

2^n biçimindeki bir sayı, 1 ile ikili olarak yazılır, ardından 0 veya daha fazla 0 sn. vb Örneğin, 1, 10, 100, 1000, ... için verilen sayıyı böler 2 en yüksek güç elde etmek için 2.

tüm güç olan, aşağıdaki iki adımı yapabilirsiniz:

  1. Numarayı ikili biçimde yazın. Örneğin, sayı 168 ise, 10101000 yazın.

  2. 10101000.

ilk bölümü kapalı çarptıktan sonra tüm bitleri 1000'e (= ondalık 8) ve geri kalan 168 durumunda 1. içeren Sağ taraftan ilk bit, daha önce

Vurucu kapalı

Kaldığınız sonuç, yani sayıyı bölen 2'nin en yüksek gücüdür.

Programsal olarak, x sizin giriş numaranız olsun. Daha sonra arzu edilen çıkış olacaktır: x - (x^(x-1))

Açıklama:

x^(x-1) [yani X XOR X-1] LSB (en az anlamlı bitinin) yan

x - (x^(x-1)) ilk 1 kurtulur kurtulur kalan kısmı ve LSB tarafındaki sadece ilk 1'i korur.

İlgili konular