首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

OJ 經典題:二進制轉十進制(位運算優化與溢出防範)

     編輯:關於C語言

OJ 經典題:二進制轉十進制(位運算優化與溢出防範)

題目:輸入二進制串(x < 2^32),輸出十進制值。多行輸入至 EOF。

位運算優化解法

#include <stdio.h>
#include <string.h>

int main() {
    char s[100000];
    while (scanf("%s", s) != EOF) {
        int n = strlen(s);
        unsigned long long ans = 0;
        for (int i = n - 1; i >= 0; i--) {
            ans += (unsigned long long)(s[i] - '0') << (n - 1 - i);
        }
        printf("%llu\n", ans);
    }
    return 0;
}

關鍵點

  • 無符號長長整型:unsigned long long 保證 64 位,覆蓋 2^32-1。
  • 位移運算:1ULL << k 替代 pow(2, k),無浮點誤差、極快。
  • 溢出防範:字面量 1 << 31 在 32 位 int 上為負數,必須加 ULL 後綴。
  • 輸入長度:題目 x < 2^32 至多 32 位,但緩衝區留大防萬一。

樣例驗證

Input:  100001
Output: 33  (32+1)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved