用位運算實現十進位制轉換為二進位制
程式碼如下:
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次對二進位制數的每一位的判斷作操作。迴圈體內部的條件判斷用到了位運算中的&運算(與運算)和<<
所以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,則顯示