C sonida qancha bitni hisoblashni hisoblash

Men bu qisqa algoritm ustida ishlayapman, bu foydalanuvchi butun sonni yozishga imkon beradi va natijada tamsayılar qancha bitni oladi: Men juda katta sonlarni kiritganda chiqdim salbiy bo'ladi. Salbiy chiqishni xohlamayman. Buni qanday hal qilishim mumkin? Bundan tashqari, ushbu jarayonni qo'llashning yana bir yo'li bormi?

 int numberHowBig =0;
printf("How many Bits? ");
scanf(" %d", &numberHowBig);
printf("n\n");


int myIncrementor = 1, myMultiplier = 1,
    finalValue = 1;
while (myIncrementor < numberHowBig){
    myMultiplier *=2;
    finalValue = finalValue + myMultiplier;
    myIncrementor++;
}
if ((numberHowBig == 0) || (numberHowBig == 1)){
    printf("Top value: %d\n\n", numberHowBig);
} else {
    printf("Top value: %d\n\n", finalValue);
}
3
Siz ko'proq to'lashingiz kerak, int imzolanganligi va tanlangan turga mos keladigan eng katta raqamni hisobga olish kerak. Siz oddiygina raqamni o'ngga siljitishingiz va bir natija olish uchun 0 ni yaratish uchun qancha siljish kerakligini hisoblashingiz mumkin, masalan: int s = 0; (raqam >> = 1) ++ s;
qo'shib qo'ydi muallif Jack, manba
long va format kodi % ld harakat qilib ko'ring. Raqamni satr sifatida o'qimasangiz, har doim mashina cheklovi bo'ladi.
qo'shib qo'ydi muallif Paul Ogilvie, manba

7 javoblar

Bundan tashqari, ushbu jarayonni qo'llashning eng yaxshi usuli bormi?

Yaxshi yo'l (ijobiy raqamlar uchun) raqamni imzosiz qoldirib, keyin nolga kamaytirish uchun qanchalik to'g'ri siljishni hisoblash. Agar siz nol bilan boshlagan bo'lsangiz, bu alohida holat va javob 1 bit.

Salbiy raqamlar muammoli bo'lib, siz 1 yoki 0-ni hisoblaysizmi? Birinchi holda, javob "turning bit kengligi" dir, lekin 1-ning ayrimlari faqat belgilarning kengaytma bitlari bo'ladi, ular haqiqatdan hammi? Ikkinchi holatda esa, faqat imzosiz qoldirilgan, bitni bekor qilish va jarayonni musbat sonlar uchun takrorlang.

0
qo'shib qo'ydi
@PaulOgilvie qilardim. Menga bu 2 ta qo'shimcha vakillikni nazarda tutadi.
qo'shib qo'ydi muallif JeremyP, manba

Bundan tashqari, ushbu jarayonni qo'llashning eng yaxshi usuli bormi?

Yaxshi yo'l (ijobiy raqamlar uchun) raqamni imzosiz qoldirib, keyin nolga kamaytirish uchun qanchalik to'g'ri siljishni hisoblash. Agar siz nol bilan boshlagan bo'lsangiz, bu alohida holat va javob 1 bit.

Salbiy raqamlar muammoli bo'lib, siz 1 yoki 0-ni hisoblaysizmi? Birinchi holda, javob "turning bit kengligi" dir, lekin 1-ning ayrimlari faqat belgilarning kengaytma bitlari bo'ladi, ular haqiqatdan hammi? Ikkinchi holatda esa, faqat imzosiz qoldirilgan, bitni bekor qilish va jarayonni musbat sonlar uchun takrorlang.

0
qo'shib qo'ydi
@PaulOgilvie qilardim. Menga bu 2 ta qo'shimcha vakillikni nazarda tutadi.
qo'shib qo'ydi muallif JeremyP, manba

% D o'rniga% u orqali raqamlaringizning imzosiz int versiyasini chop etishingiz mumkin. Muammoingiz "int" turidagi 4 baytlik xotira bilan cheklanganligi va siz uni kattalashtirib (myMultiplier-ni qo'shib) oshirganligingizdan kelib chiqadi, shuning uchun u 4 bayt uchun juda katta bo'ladi, shuning uchun u narsalarni buzadi.

0
qo'shib qo'ydi
int "4 bayt bilan cheklangan emas", lekin hech bo'lmaganda kamida 16 bit kenglikda bo'lishi kerak.
qo'shib qo'ydi muallif David Bowling, manba

% D o'rniga% u orqali raqamlaringizning imzosiz int versiyasini chop etishingiz mumkin. Muammoingiz "int" turidagi 4 baytlik xotira bilan cheklanganligi va siz uni kattalashtirib (myMultiplier-ni qo'shib) oshirganligingizdan kelib chiqadi, shuning uchun u 4 bayt uchun juda katta bo'ladi, shuning uchun u narsalarni buzadi.

0
qo'shib qo'ydi
int "4 bayt bilan cheklangan emas", lekin hech bo'lmaganda kamida 16 bit kenglikda bo'lishi kerak.
qo'shib qo'ydi muallif David Bowling, manba

Ha, yaxshiroq yo'l bor. Siz bu kabi bitsel o'zgarishlardan foydalanishingiz mumkin:

if ((numberHowBig == 0) || (numberHowBig == 1)){
    printf("Top value: %d\n\n", numberHowBig);
} else {
    int finalValue = (1 << numberHowBig) - 1;
    printf("Top value: %d\n\n", finalValue);
}

Agar kattaroq mahsulotni boshqarish imkoniga ega bo'lishni istasangiz, katta hajmdagi fayl turini foydalaning.

0
qo'shib qo'ydi

libmath dan foydalanish bu muqobildir:

printf( "Top Value %u \n",
    (unsigned int) exp2((double) numberHowBig)-1 );
0
qo'shib qo'ydi

libmath dan foydalanish bu muqobildir:

printf( "Top Value %u \n",
    (unsigned int) exp2((double) numberHowBig)-1 );
0
qo'shib qo'ydi