2013-10-27 27 views
13

Maskeleri kullanmaya ve belirli bitleri baytta işlemeye çalışıyorum. Örnek:C dilinde bir baytta belirli bir bit nasıl açılır?

Belirli konumlarda iki bit döndüren bir program yazmak istiyorum. bit 0 konumunda ve üçüncü konumda. Yani, 11100011, 01110011 olur.

Bu bitleri nasıl değiştirebilirim? Böyle bir XOR seti bitleri sen çevirmek isteyen pozisyonlarda ve sonra yürütün:

+1

Bu ancak google boolean cebir ve doğruluk tablolarına belirli bir yanıt alırsınız. –

cevap

15

biraz bir maske ile XOR-ing yapılır saygısız İşte

int mask = 0x90; // 10010000 
int num = 0xE3; // 11100011 
num ^= mask;  // 01110011 

birkaç nokta belirtilmiştir: ,

  1. bit genel olarak en az önemli konumdan sayılır, böylece örnek değil pozisyonları 0, pozisyonlar 4 ve 7 bit döndürür ve 4
  2. , tek bir pozisyon için biraz maskesi oluşturmak ifade 1 << n kullanmak için nerede n, en az anlamlı bitden sayılan konum numarasıdır.
  3. Tek bir maske içinde birden çok biti birleştirmek için | operatörünü kullanın. Örneğin, (1 << 4) | (1 << 7), 4 ve 7 nolu bitleri çeviren maskeyi yapılandırır.
0

Her şeyden önce, iyi şanslar!

Bir açıklama - bitlerin sayısından sağa ve sola doğru sayılması daha yararlıdır, çünkü çeşitli bayt/kelime boyutları (8 bit, 16 bit, vb.) Vardır ve bu sayım uyumluluğu daha iyi korur. Yani senin durumunda, # 7 ve # 4 (sıfır sayım) bitlerine başvuruyorsun.

'Çevir' (0 < -> 1 bit değiştir) veya 'birini' diğeri arasında 'değiştir' mi demek istediniz?

İlk seçenek için, yukarıdaki yanıt ("int mask = 0x90; // 10010000" olan XOR) çok iyi. İkincisi için, biraz daha zor (ama çok değil).

+0

Teşekkürler! Geçiş yapmak istedim! –

+0

Yardım için sevindim! Bu arada, iyi cevaplar için "oylama", takdirinizi göstermenin iyi bir yoludur ;-) – AssafR

1

Bitleri çevirmek için, özel VEYA bit işlevini kullanabilirsiniz. Bu, iki işlenen (tipik olarak, üzerinde çalışmak istediğiniz değer ve bitlerin ne zaman çevrileceğini belirleyen maske) alır. EXclusive OR (XOR) operatörü yalnızca bir tane döndürür ve yalnızca ikisinden biri 1'e ayarlanır, ancak her ikisi de DEĞİL. senin bayt x ise

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    int num = 7; //00000111 
    int mask = 3; //00000011 

    int result = num^mask; //00000100 
    printf("result = %d\n", result); //should be 4 

    return 0; 
} 
2

ve i-inci ve j-inci pozisyonda bit geçmek istiyorum:: Aşağıdaki (basit) örneğe bakın içinde,

x = x^((1<<i) | (1<<j)); 

Yani senin durumda, sadece olurdu (1 < < 4) | (1 < < 7). :)

İlgili konular