std::bitset
'um var ve bitset türü, bitset'i bir sayıya çevirmek için to_ulong
yöntemini de sağlar, benim problemim, bitset'te bir aralık düşünürken bitset'i bir sayıya çevirmekle ilgili, kendi powerof2 işlevimi uygulamam gerekiyor ya da daha standart bir yaklaşıma sahip bir şey var mı?Bir C++ bitsetindeki bitlerin bir aralık alt kümesini bir sayıya nasıl dönüştürürüm?
8
A
cevap
5
Sen çıkışı ile
#include <bitset>
#include <iostream>
// drop bits outside the range [R, L) == [R, L - 1]
template<std::size_t R, std::size_t L, std::size_t N>
std::bitset<N> project_range(std::bitset<N> b)
{
static_assert(R <= L && L <= N, "invalid bitrange");
b >>= R; // drop R rightmost bits
b <<= (N - L + R); // drop L-1 leftmost bits
b >>= (N - L); // shift back into place
return b;
}
int main()
{
std::bitset<8> b2(42); // [0,0,1,0,1,0,1,0]
std::cout << project_range<0,8>(b2).to_ulong() << "\n"; // 42 == entire bitset
std::cout << project_range<2,5>(b2).to_ulong() << "\n"; // 8, only middle bit
}
Live example gibi gereksiz bit bırakabilirsiniz.
1
Sen ara birikim olarak string
kullanabilirsiniz:
bitset<32> bs (string("1011"));
cout << bs.to_ullong() << endl;
// take a range - 2 last bits in this case
string s = bs.to_string().substr(bs.size() - 2);
bitset<32> bs1 (s);
cout << bs1.to_ullong() << endl;
Baskılar:
11 3
+0
seçenekleri olması güzel, ama bunun gereksiz geçici değişkenler oluşturduğunu düşünüyorum. Adımlarımı çok küçük bir sayıyla küçültmem gerekiyor. – user2485710
İlgili konular
- 1. Koleksiyonun bir alt kümesini bir C# yöntemine nasıl geçirebilirim? C++
- 2. Bir sayıyı bir INTERVAL dakikaya nasıl dönüştürürüm?
- 3. Bir çalışma sayfası alt kümesini nasıl çözebilirim?
- 4. VBA'da bir Döngü olan bir altprogram alt kümesini nasıl ararım?
- 5. Yalnızca uzaktaki git dallarının bir alt kümesini getirin veya yalnızca bunların bir alt kümesini gitk
- 6. Bir UIColor'u onaltılık bir dizeye nasıl dönüştürürüm?
- 7. Genel bir yolla bir tamsayıda bitlerin üzerine yazmak
- 8. Veri kümesini bir SSRS alt raporunda nasıl doldurabilirim?
- 9. C kümesinden bir pencere kümesini yönetme #
- 10. Büyük bir veri kümesini C# nesnelerine dönüştürme
- 11. Bayt akışını başka bir kodlamaya nasıl dönüştürürüm?
- 12. Bir simetrik matrisi "dist" nesnesine nasıl dönüştürürüm?
- 13. Belirli bir aralık için dizi değerlerini C#
- 14. Başka bir data.table sütununu eşleştirerek data.table alt kümesini silebilir
- 15. javascript bir sayıya dönüştürün arabellek
- 16. Siparişi tanımlayan vektörün alt kümesini verimli bir şekilde sıralayın
- 17. Karmaşık bir veri kümesini recast()
- 18. XHTML’yi keyfi bir sayıya nasıl ayırabilirdiniz?
- 19. Delphi'de istenen bir sayıya dize nasıl kesilir?
- 20. Java'da HTTP durum kodunu metne nasıl dönüştürürüm?
- 21. Bir tam sayıya dönüştürmeden bir ikili sayının 1'e azaltılması
- 22. C - Bir alt fonksiyonun çıktısını nasıl önleyebilirim?
- 23. C# içinde bir alt sınıf nasıl oluşturulur?
- 24. Yeni bir sütun kümesini bir data.table
- 25. Belirli bir sayıya verilen bir sayı dizisi oluşturma
- 26. Neden bir veri kümesini bir işleve geçiremiyorum?
- 27. Varchar'dan sayıya sahip bir sütunun türünü int
- 28. Başka bir varlık tarafından sahip olunan bir JPA varlığının alt kümesini nasıl gönderirsiniz?
- 29. Java: Bir dizinin bir alt kümesini seçmenin kolay bir yolu var mı?
- 30. C# içinde bir argv ile bir alt işlemi nasıl başlatırım?
user2485710 @ orijinal versiyonunda bazı hatalar yaptı. Bu test edildi, canlı örneğe bakın. – TemplateRex
bekle, benim için çalışmıyor, bu durumda http://ideone.com/RNJXNH programım 15 basmalı, 120 bit yazdırıyor çünkü en sağdaki bitleri düşürmez ... – user2485710
@ user2485710 bit [3, 7) * [0,32] 'nin bir alt kümesi olarak * 120'yi temsil eder, eğer 3 biti deşifre ederseniz, 15 alırsınız. İstediğiniz davranışsa, aşağıdaki ifadeyi değiştirin: 'b >> = (num) - l + r); – TemplateRex