Bits - Least-Significant / Lowest è 0th o 1st; zero o uno indicizzato

0

Domanda

C'è un consenso approssimativo se si dice che la maschera di bit 0x01 abbia il bit "zeroth" impostato, o il "primo" bit impostato?

Se non c'è un consenso approssimativo sul fatto che esista una risposta giusta generalmente , c'è almeno un consenso approssimativo sul fatto che esiste una risposta corretta contestualmente (ad es. come il codice sta semanticamente usando i bit per determinare la risposta)?

Sfondo

Per essere chiari, ho generalmente familiarità con la codifica di basso livello e sono quindi a mio agio con l'indicizzazione zero, ma essendo un essere umano cresciuto in normali culture umane, mi sento a mio agio anche con l'indicizzazione. Conosco argomenti per entrambe le parti. Ho letto anche ogni altra domanda + le risposte che mi sono state suggerite mentre scrivevo ciò che sembrava riguardare questo tipo di problema, ma nessuno di questi era realmente applicabile ai bit.

Vedi, se stessimo parlando di array, o sequenze, o qualsiasi altra cosa, troverei che sia abbastanza facile decidere - se si tratta di un linguaggio o piattaforma sufficientemente bassi (dove gli indici si mappano direttamente a offset o avere altre proprietà utili se indicizzato a zero), o con persone che hanno una indicizzazione zero radicata, lo sceglierei, quando si tratta di alcune astrazioni di livello superiore dove mi aspetto più abitudini di conteggio umano "naturali", Sceglierei l'altro.

Ma i bit ... i bit sono in questa perversa via di mezzo. I bit sono fondamentalmente astratti (cifre di un numero in binario: quale cifra meno significativa? Prenderò "prima" su "zeroth", perché questo è il conteggio, non l'indicizzazione) ma anche molto rilevante per il lavoro di livello estremamente basso, dove lo zero-indexing è naturale e utile (vuoi solo il n th bit? Shift 1 di n ).

Motivazione

In pratica, questo è venuto fuori perché non riesco a decidere tra questi due frammenti di codice C:

/* Bits are one-indexed - even in C, this feels more natural */
#define UCHAR_NTH_BIT_m(n) (unsigned char )(1 << ((n) - 1))
/* Bits are zero-indexed - this feels "purer" in some ways */
#define UCHAR_NTH_BIT_m(n) (unsigned char )(1 << (n))
/* NOTE: undefined behavior if (n < 1) or (n < 0), respectively. */
    
posta mtraceur 08.04.2016 - 09:39
fonte

3 risposte

2

Is there a rough consensus if the bitmask 0x01 is properly said to have the "zeroth" bit set, or the "first" bit set?

La tua domanda non avrebbe superato un sondaggio di sondaggi onesti (oxymoron?) perché era in testa. Ovviamente se avessi la tua domanda potrebbe non essere stata lunga. Prova questo,

D: Qual è il bit in questo, 0x01, assumendo little endian?

IMHO avresti ricevuto risposte che dicevano o /, bit zero o lsb. È altamente improbabile che qualsiasi "programmatore" ("Io non sono un animale") avrebbe detto il bit uno.

È 2 alla potenza di 0 = 1 o 2 alla potenza di 1 = 1? Gli umani implicano zero compensazioni senza pensare, per esempio quanti anni hai? Quanto è lontano da casa tua lavorare?

La mia risposta specifica a questo,

#define UCHAR_NTH_BIT_m(n) (unsigned char )(1 << ((n) - 1))

è Si prega di non farlo. perché nessun essere umano lo guarderà, solo "programmatori".

    
risposta data 08.04.2016 - 11:10
fonte
2

Direi che 0x01 ha impostato "bit 0", poiché ha il bit corrispondente a 2 0 impostato. Ho difficoltà a motivare un programma di conteggio per bit che non preservi che "bit N" è il bit che corrisponde al valore 2 N .

    
risposta data 08.04.2016 - 11:22
fonte
1

I bit non hanno posizioni numeriche. Invece parliamo del bit meno significativo (LSB) e del bit più significativo.

Sfortunatamente, in generale le cose non sono così semplici. La generalizzazione dell'LSB è "8 bit inferiori" o "4 bit inferiori" e potresti parlare ad es. il 3 ° bit più basso. Pertanto, la terminologia è decisamente basata su 1. Ma c'è anche il problema irritato di Endianness , il che significa che su molti sistemi, il 9 ° bit più basso di un intero è non si trova effettivamente in 9a posizione, non importa da che parte si scansionano le celle di memoria. Forse questa è una delle ragioni per cui i singoli bit in un numero a 32 bit vengono raramente dati dei numeri.

    
risposta data 08.04.2016 - 10:46
fonte

Leggi altre domande sui tag