2012-04-12 34 views
6

I olan aşağıdaki kısıtlamalara c ile x byte n değiştirmektir replaceByte(x,n,c) olarak adlandırılan fonksiyonu:32 bit bayt yerine sayı

  • 0 (LSB) 3 ila sayılı Bayt (MSB)
  • Örnekler: replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • Sen 0 < = n < = 3 ve 0 < = c < = 255
  • Yasal ops varsayabiliriz : ! ~ &^| + << >>
  • Azami OPS: 10

    int replaceByte(int x, int n, int c) { 
         int shift = (c << (8 * n)); 
         int mask = 0xff << shift; 
         return (mask & x) | shift; 
        } 
    

ama test bu hata olsun:

HATA: Test replaceByte (-2147483648 [0x80000000], 0 [0x0], 0 [0x0]) başarısız oldu ... ... 0 verir [0x0]. Eğer fikriniz yoksa o * ... Sonunda dışarı çözebileceğini yasal bir operatör değil ve anlayarak sonra -2147483648 [0x80000000]

olmalı, bu ne yaptım: Bu yana

int replaceByte(int x, int n, int c) { 
    int mask = 0xff << (n << 3); 
    int shift = (c << (n << 3)); 
    return (~mask & x) | shift; 
} 

cevap

4

Ahh ... Neredeyse ordasın.

sadece bölge maskelenir ve tam tersi için hariç tüm olanlar içermelidir

return (~mask & x) | shift; 

mask için

return (mask & x) | shift; 

değiştirin.

Ben bu basit kod kullanıyorum ve gcc içinde çalışıyor

#include<stdio.h> 

int replaceByte(int x, int n, int c) 
{ 
    int shift = (c << (8 * n)); 
    int mask = 0xff << shift; 
    return (~mask & x) | shift; 
} 

int main() 
{ 

    printf("%X",replaceByte(0x80000000,0,0)); 

    return 0; 
} 
+2

hmmm bile, ben aynı hata alıyorum – asdfghjkl

+0

@ shaynie Benim düzenleme görmek –

+0

Nasıl - - "int mask = 0xff << vardiya" açıklayabilir misiniz? "Sizin için çalışır. OP gibi güncellenmiş muhtemelen int mask = 0xff << (n << 3); " –

6

,

  • ileri vites değiştirirken

    1. Cast c 32 bit numarasına herhangi bit kaybetmemeniz için: ödevi gibi görünüyor ben kod sonrası giderek, ancak gerçekleştirmek için gereken adımlar liste değilim c tarafından sola uygun sayıda bit (kayması yok ise, n==1 8 vardiyası vb.)
    2. x en düşük 8 bitini sıfırlayacak bir 32 bit bit maskesi oluşturun, ardından bu maskeyi aynı miktarda kaydırın. son adım
    3. bit usulü gerçekleştirmek ve kaydırılmış bit maskesi ve x arasında
    4. x uygun bit üzerinden sıfır kaydırılır c değer bit OR (ya da ekleme) uygulayın ve x ikinci
    maskelenmiş bit yerine için
  • +0

    Tamam ben senin, en düşük 8 bit sıfır olacak bir 32 bit bit maskesi oluşturma" demek kısmı hariç bütün bunlar anlıyorum x ..." – asdfghjkl

    +0

    @shaynie" x "bitlerini değiştirmeye başlamadan önce, değiştirilecek 8 biti sıfırlamanız gerekir. İşte o bit maskesi geliyor. – Praetorian

    +0

    Tamam, mantıklı geliyor, bunun üzerine bir miktar kod koydum – asdfghjkl

    İlgili konular