Bit aus einer short-Variablen lesen.

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ich würde nen bitweises & mit ner bitmask,die dem Bit entspricht, und dem Wert durchführen.
    Im einfachsten Fall also:

    Quellcode

    1. short s = 103;
    2. if(s & (1<<5))
    3. std::cout<<"5. Bit gesetzt"<<std::endl;
    4. else
    5. std::cout<<"5. Bit nicht gesetzt"<<std::endl;


    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • [langeweile]
    ...oder deluxe:

    Quellcode

    1. #include <iostream>
    2. #include "boost/static_assert.hpp"
    3. #include "boost/type_traits.hpp"
    4. template <typename T>
    5. bool get_bit_at(T value,size_t pos)
    6. {
    7. BOOST_STATIC_ASSERT(boost::is_integral<T>::value);
    8. if(pos <= (sizeof(T)*8))
    9. {
    10. T mask = (1<<static_cast<T>(pos));//Cast ist nur um ne Compiler Warnung abzustellen
    11. return (value & mask) != 0 ;
    12. }
    13. else
    14. throw std::runtime_error("Keine gueltige Bitposition für diesen Datentyp");
    15. }
    16. int main()
    17. {
    18. short s = 52103;
    19. for(size_t pos = 0;pos <= (sizeof(s)*8);pos++)
    20. std::cout<<"Das Bit an Position "<<pos<<(get_bit_at(s,pos)?" ist gesetzt":" ist nicht gesetzt")<<std::endl;
    21. return 0;
    22. }
    Alles anzeigen

    [/langeweile]

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • hi leute,

    ich hab auch mal dazu geschrieben (natürlich nichts im vergleich zu void). danke
    also gebt ruhig euren senf dazu.
    danke nochmal an hth für die hinweise betreff ConvASCII.


    Quellcode

    1. /* Includefiles */
    2. #include <stdio.h>
    3. #include <stdlib.h>
    4. /* Defines */
    5. /* Declarations of Structures */
    6. /* Enum */
    7. /* Declarations of Functions */
    8. int ReadInNumber();
    9. int ConvASCII(int aASCII);
    10. /* Main-Function */
    11. int main(int argc, char *argv[])
    12. {
    13. int i_number;
    14. int i_bit;
    15. char *str_in[256];
    16. /********************************************
    17. Greeting
    18. ********************************************/
    19. printf("\n\nSie haben das Programm %s gestartet.\n\tWillkommen.\n", argv[0]);
    20. printf("___________________________________________________________________\n\n");
    21. /********************************************
    22. Menu
    23. ********************************************/
    24. printf("geben Sie nun eine Zahl ein:\n");
    25. printf(">");
    26. i_number = ReadInNumber();
    27. printf("Ausgabe:\t%d\n", i_number);
    28. printf("Welches Bit wollen Sie ueberpruefen, ob es gesetzt ist (Big Endian Order)?\n");
    29. printf(">");
    30. i_bit = ReadInNumber();
    31. while( i_bit > (sizeof(int)*8) )
    32. {
    33. printf("Diese Bitstelle liegt ausserhalb des Wertebereichs.\n");
    34. printf("Bitte ueberpruefen Sie eine andere Bitstelle.\n");
    35. printf(">");
    36. i_bit = ReadInNumber();
    37. }
    38. if(i_number & (1<<i_bit)) printf("%d. Bitstelle gesetzt.\n", i_bit);
    39. else printf("%d. Bitstelle nicht gesetzt.\n", i_bit);
    40. printf("\nDas Programm wird nun beendet.\n");
    41. /********************************************
    42. Passing
    43. ********************************************/
    44. printf("\n___________________________________________________________________\n\n");
    45. }
    46. /********************************************
    47. Funktionsimplementationen
    48. ********************************************/
    49. /* ReadInNumber-> Zahl einlesen */
    50. int ReadInNumber()
    51. {
    52. int i_ascii;
    53. int i_number;
    54. i_ascii = i_number = 0;
    55. while( (i_ascii = getchar()) != '\n' )
    56. {
    57. if( !((i_ascii < 48) || (i_ascii > 57)) )
    58. {
    59. i_number *= 10;
    60. i_number += ConvASCII(i_ascii);
    61. }
    62. }
    63. return i_number;
    64. }
    65. /* ConvASCII-> ASCII-Werte in Zahlen konvertieren */
    66. int ConvASCII(int aASCII)
    67. {
    68. if (aASCII >= 48 && aASCII <= 57)
    69. return aASCII - 48;
    70. else
    71. return 0;
    72. }
    Alles anzeigen


    gruss
    chris
  • "chrishawaii" schrieb:


    Quellcode

    1. if (aASCII >= 48 && aASCII <= 57)


    Solche direkten Abfragen solltest du vermeiden.
    Für sowas gibt es z.B. die isdigit Funktion welche dann das aktuell gesetzte locale berücksichtig.In unseren Breiten ist zwar der ASCII Zeichensatz verbreitet,aber es gibt halt auch noch andere.Und wenn du ne Funktion schreibst....wäre es nicht besser wenn diese für alle Zeichensätze funktioniert anstatt sich auf einen festzulegen?

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)
  • "phax" schrieb:

    Du hast natürlich völlig recht, aber da dies im ASCII Bereich der Codepages liegt funktioniert das eigentlich überall, wenn man mal von 2- oder mehr-Byte Zeichen absieht. Sogar für UTF-8 funzt das.

    Ich weiß :D .
    Es gibt vieles in den C/C++ Standards was irgendwelche "Eventualitäten" berücksichtigt ,die heuzutage eigentlich noch garnicht zum tragen gekommen sind.
    Aber es könnte ja irgendwann mal sein...
    Halten wir einfach fest dass man mit isdigit und Konsorten garantiert auf der sicheren Seite ist :wink: .

    Gruß void
    "Probleme kann man niemals mit derselben Denkweise lösen,
    durch die sie entstanden sind." (A. Einstein)