1. 程式人生 > >用位運算實現十進位制轉換為二進位制

用位運算實現十進位制轉換為二進位制

程式碼如下:

 1 #include <iostream>        //將十進位制數轉化為二進位制數,位運算的取位操作
 2 using namespace std;
 3 int main()
 4 {
 5        unsigned short i;
 6        cout << "請輸入一個小於65536的正整數" << endl;
 7        cin >> i;
 8        for(int j=15; j >= 0; j--)
 9        {
10               if
( i & ( 1 << j) ) cout << "1"; 11 else cout << "0"; 12 } 13 cout << endl;
14
15     return 0;
16 }

分析:

分析一下這個程式的演算法原理,順便複習一下位運算的奇妙吧。

這是一個將無符號十進位制數轉化為標準16位二進位制數的程式。

程式的主體部分,for語句從15遞減到0,一共16次對二進位制數的每一位的判斷作操作。迴圈體內部的條件判斷用到了位運算中的&運算(與運算)和<<

運算(左移運算)。<<運算表示把1的二進位制形式整體向左移j位,左移後低位補0,移出的高位部分被捨棄。例如,當j15時,表示式(1<<j)的值為1000000000000000;當j10時,值為0000010000000000

所以i&1<<j)的值相當於把i的二進位制的第j位取出來(i的第j位與(1<<j)的第j位(由上述可以,為1)作與運算,只有當i的第j位為1時值為真)。迴圈後既得i的二進位制形式。

有的童鞋可能覺得用mod(取餘)運算照樣可以達到效果,但是位運算的“個性”就決定了它直接對資料的二進位制形式進行操作的快捷性(一般計算機的資料儲存基本形式為二進位制形式),兩個相同演算法的程式,用了位運算後會使程式速度上有提高。

類似的 LeetCode 上的第一題 :

Number of 1 Bits

Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also known as the Hamming weight).

For example, the 32-bit integer ’11' has binary representation 00000000000000000000000000001011, so the function should return 3.

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

算整數 n 的 Hamming weight,也就是其二進位制位中非零位的個數。

AC程式碼:

1 int hammingWeight(uint32_t n)  {
2     int i, ans=0;
3     for (i=31; i>=0; i--)
4     {
5         if (n & (1 << i)) ans++;
6     }
7     return ans;
8 }

  LeetCode 上的第二題:

Reverse Bits

Reverse bits of a given 32 bits unsigned integer.

For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).

Follow up:
If this function is called many times, how would you optimize it?

Credits:
Special thanks to @ts for adding this problem and creating all test cases.

AC程式碼:

 1 uint32_t reverseBits(uint32_t n) {
 2     int i;
 3     uint32_t ans;
 4     
 5     if (n & 1) ans=1;
 6     else ans=0;
 7     for (i=1; i<=31; i++)
 8     {
 9         ans <<= 1;
10         if ((n & (1 << i))) ans |= 1;
11     }
12     
13     return ans;
14 }

相關推薦

運算實現十進位制轉換二進位制

程式碼如下: 1 #include <iostream> //將十進位制數轉化為二進位制數,位運算的取位操作 2 using namespace std; 3 int main() 4 { 5 unsigned short i; 6

C語言程式實現十進位制轉換二進位制

題目: 寫一個函式,輸入一個10進位制數,輸出它的2進位制,例如:輸入9,輸出1001 思路: 十進位制數轉換為其他進位制時,轉換成幾進位制就除以幾進位制求餘。 程式碼: #include "stdio.h" #define N 100 int main() {

C語言實現十進位制轉換二進位制

/* * 檔名:二進位制轉換.c * 功能描述:把10進位制數轉換為二進位制數 * 編寫人:王廷雲 * 編寫日期:2017-1-10 */ #include <stdio.h> #

遞迴函式實現十進位制轉換十六進制輸出

   遞迴函式的定義,不應出現無終止的遞迴呼叫。而應定義為有限次數、有終止的遞迴呼叫函式。       對於一個問題,只要能夠知道遞迴定義式,及邊界條件(即遞迴終止的條件),就可以編寫一個遞迴函式。 #include <stdio.h> #define BASE

十進位制轉換二進位制、八進制、十六進

將十進位制轉換為其它進位制時比較複雜,整數部分和小數部分的演算法不一樣。 1) 整數部分 十進位制整數轉換為 N 進位制整數採用“除 N 取餘,逆序排列”法。具體做法是: 將 N 作為除數,用十進位制整數除以 N,可以得到一個商和餘數; 保留餘數,用商繼續除以 N,又得到一個新的商和餘數;

使用移位操作、與操作把十進位制轉換二進位制

針對上篇文章c++的寫法,改寫成java的寫法,測試發現有下面兩種,但是現在我還不能完全理解,暫時記錄,後面理解後再詳細註解。 public class BaseTest { public stat

資料結構|實現十進位制轉換二進位制(實驗3.5)

一、實驗目的 1、熟練掌棧的結構特點,掌握棧的順序儲存結構和實現。 2、學會使用棧解決實際問題。 二、實驗內容 1、自己確定結點的具體資料型別和問題規模,建立一個順序棧,實現棧的壓棧和出棧操作。 三、實驗步驟 1、依據實驗內容分別說明實驗程式中用到的資料型別的

C++實現十進位制轉換任意進

十進位制數在C++中用什麼表示? 一個十進位制數,在程式中用什麼方式轉換為其他進位制,和在數學中的思路一樣嗎?? 輸出的結果用什麼表示比較方便? 下面的程式中digit思考為什麼要用靜態變數? #include <iostream> #include <

運算實現四則運算之加減乘除(運算求一個數的1/3) via Hackbuteer1

esp sub 沒有 正整數 過程 介紹 異或 sin 完成 轉自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位異或;&:按位與; | :按位或 計算機系統中,數值一律用補碼來表示:因為

Python 十進位制轉換二進位制 高位補零

這裡需要使用內建函式''.format() 高位補零 >>> a = 2 >>> b = '{:08b}'.format(a) 輸出結果為八位二進位制,且高位補零。 高位不補零 >>> b = '{:8b}'.for

c語言運算實現兩個數平均數

c語言用位運算實現兩個數平均數 對於十進位制而言,向右移動一位就是除以10, 對於二進位制而言,向右移動一位就是除以2, 對於八進位制而言,向右移動一位就是除以8, 對於十六進位制而言,向右移動一位就是除以16 因為計算機是通過二進位制來計算的,知道這個規律之後我們可以編寫程式碼 int

運算實現四則運算之加減乘除(運算求一個數的1/3)

                聽同學百度二面中,不準用四則運算操作符來實現四則運算。一想就想到了計算機組成原理上學過的。位運算的思想可以應用到很多地方,這裡簡單的總結一下用位運算來實現整數的四則運算。加法運算:int AddWithoutArithmetic(int num1,int num2){ if(n

運算實現求絕對值-有效避開if-else判斷

一般情況下,如果要我們寫一個求絕對值的函式,我們的實現很有可能會是這樣: template<class T>T abs_Normal(T tNum){    if(tNum >0.0)        return tNum;    elsereturn-tNum;} 也就

Python下十進位制轉換二進位制

前兩天,在讀高中的姨弟找我,說他資訊考試有一道題不會,要在Python下把十進位制轉換為二進位制,問我會不會,我沒學過Python,C只學會了皮毛,靠著一丁點對程式設計的瞭解,網上查了查,總算拼湊出來了。PS:Python下是有現成函式的,只不過不符合題目要求,所以沒用程式碼

C語言實現十進位制轉換二進位制

#include<stdio.h>  //現定義一個數組,然後把用2整除這個數,得到商和餘數,再用商繼續除以2,直到值為0結束迴圈, //然後把這些餘數放在陣列中,輸出即可; int main() { int n ,temp,s[100],i=0;printf(

運算實現四則運算之加減乘除

//遞迴版本 int _add(int num1,int num2){ int sum,carry; if(num2==0) return num1;//沒有進位的時候完成運算 sum=num1^num2;//完成第一步沒有進位的加法運算

C++運算實現迴圈移位

轉自:http://www.cnblogs.com/alex4814/archive/2011/09/08/2171862.html 迴圈移位區別於一般移位的是移位時沒有數位的丟失。 迴圈左移時,用從左邊移出的位填充字的右端。 迴圈右移時,用從右邊移出的位填充字的左

java實現輸入一個任意十進位制轉換二進位制

package com.xingyi.one.firstdemo; import java.util.Scanner; public class FirstDemo {          //將任意一個十進位制數轉換為二進位制數 &

鏈棧實現十進位制二進位制轉換

#include <iostream> using namespace std; typedef struct Stack{ int data; int length; Stack *next; } StackNode, *LinkStack; bool StackInit

C語言實現1個無符號整型的十進位制數,按照要求轉換二進位制並輸出

輸入1個無符號整型的十進位制數,將其轉換成二進位制,並輸出。(6分) 題目內容: 從鍵盤輸入1個小於65536的無符號整型的十進位制數,將其轉換成二進位制,並輸出。 具體要求完成的功能如下: 1)如輸入負數,則顯示 “請輸入非負數” 2)如超過65535,則顯示