1. 程式人生 > >某個數字進行位運算

某個數字進行位運算

將數字按位倒序

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?
Related problem: Reverse Integer

思路:將數字倒敘,就是將左邊位放到新數的右邊位上去。直觀想法就是,用1與原數,或新數並左移。再不斷迴圈上述操作。

public int reverseBits(int n) {
    int rs = 0;
    for(int i = 0; i < 32; i++, n >>>= 1) rs = (rs << 1)|(1 & n);
    return rs;
}

問如何優化
思路:用交換的思想,如果是0與31位交換,1與30….也就是要進行32次移位和16次或運算。
而優化可以利用一個整體與一個整體交換來減少移動次數(類似希爾思想)
32位先將前16位與後16位交換,再將8位8位交換,再將4位4位交換,2位2位,1位1位。這樣就減少至10次移位和5次或運算。
注:運算子優先順序。。
+,-,*,/,++,– 大於 移位運算子 大於 & 大於 ^ 大於 |

public int reverseBits(int n) {
    n = n >>> 16 | n << 16;
    n = (n & 0xFF00FF00) >>> 8 | (n & 0x00FF00FF) << 8;
    n = (n & 0xF0F0F0F0) >>> 4 | (n & 0x0F0F0F0F) << 4;
    n = (n & 0xCCCCCCCC) >>> 2 | (n & 0x33333333) << 2;
    n = (n & 0xAAAAAAAA
) >>> 1 | (n & 0x55555555) << 1; return n; }

判斷數字位中有多少個1

Write a function that takes an unsigned integer and returns the number of1' bits it has (also known as the Hamming weight).
For example, the 32-bit integer11' has binary representation 00000000000000000000000000001011, so the function should return 3.

思路
有符號數右移並判斷,會死迴圈:負數的二進位制右移會在高位補1
一種高效方法:本身與本身-1相與。得到結果為最右邊1的左邊結果(1100 & 1000 —> 1000),不需要與32次,有多少1就與幾次。

public int hammingWeight(int n) {
    int count = 0;
    while(n != 0){
        n &= (n-1);
        count ++;
    }
    return count;
}

另一種高效方法:運用整體計算方法
將每2位中1的個數儲存在這2位上
將每4位中1的個數儲存在這4位上
將每8位中1的個數儲存在這8位上
將每16位中1的個數儲存在這16位上
將每32位中1的個數儲存在這32位上

public int hammingWeight(int n) {
    n = (n & 0x55555555) + (n >>> 1 & 0x55555555); 
    n = (n & 0x33333333) + (n >>> 2 & 0x33333333);
    n = (n & 0x0F0F0F0F) + (n >>> 4 & 0x0F0F0F0F);
    n = (n & 0x00FF00FF) + (n >>> 8 & 0x00FF00FF);
    n = (n & 0x0000FFFF) + (n >>> 16 & 0x0000FFFF);
    return n;
}

相關推薦

某個數字進行運算

將數字按位倒序 Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in binary as 0000001010

在C#中對枚舉進行運算--枚舉組合

code 實例方法 類型 public 最大 數值 必須 span bsp   由於枚舉的基礎類型類型為基本的數值類型,支持位運算,因此可以使用一個值表示多個枚舉的組合,在定義枚舉時需要指定枚舉數為2的冪指數方便進行位運算,即枚舉數為1,2,4,8…,或1,1<<

在C#中對列舉進行運算--列舉組合

  由於列舉的基礎型別型別為基本的數值型別,支援位運算,因此可以使用一個值表示多個列舉的組合,在定義列舉時需要指定列舉數為2的冪指數方便進行位運算,即列舉數為1,2,4,8…,或1,1<<1,1<<2…: public enum MyEnum { MyEnum1 = 1

列舉進行運算 列舉組合z 列舉進行運算--列舉組合

列舉進行位運算--列舉組合 public enum MyEnum { MyEnum1 = 1, //0x1 MyEnum2 = 1 << 1, //0x2 MyEnum3 = 1 << 2, //0x4 MyEnum4 = 1 <

使用JAVA進行運算

位運算: 直接對二進位制進行運算。Java除了具備高階語言的特點外,也支援位運算操作。 在計算機中,有符號數有3種表示方法:原碼、反碼和補碼。所有資料的運算都是採用補碼進行的。 原碼:二進位制定點表示法,即最高位為符號位,0表示正,1表示負,其餘位表示數值的大小; 反碼

Java中對字串中的數字進行求和運算

字串中的數字進行求和    1 public class StringDemo { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5

c#如何將一個整數轉換二進位制,並進行運算

進行位運算,是不需要轉化成二進位制的。 CPU在運算的時候,內部把所有資料都看成二進位制。Convert 看類名就知道,是提供一個轉換函式的。 位運算只能在 byte, char, short, us

Java中進行運算

java中常用位運算子: 1、與運算子 & 使用規則:兩個運算元中位都為1,結果才為1,否則結果為0 2、或運算子 | 使用規則:兩個位只要有一個為1,那麼結果就是1,否則就為0 3、非運算子- 使用規則:如果位為0,

JavaSE7基礎 運算 int類型變量進行 與或非異或

網上 深入 ava demo new 與或非 反碼 技術分享 notepad jdk版本 :jdk-7u72-windows-i586系統 :Windows7編輯器 :Notepad++ v7.4.2註意事項 :博文內容僅供參考,不可用於其他用途。 代

運算解決“一個數組中,只有一個數字出現n次,其他數字出現k次”問題

不重復 blog ron 運用 ons 利用 缺失 tail 位運算符 轉自:https://blog.csdn.net/monster_girl/article/details/52928864 在學習完位操作後,經常會遇到一類關於查找缺失整數的問題。 第一類是給你一個

一組資料中只有一個數字出現一次,其他所有數字都是成對出現的。請找出這個數。(使用運算

連續異或即可得到這個數 #include <windows.h> #include <sdilo.h> int find(int a[],int len) { int ret = 0; int i = 0; for (i = 0; i < len;

運算 -- 只出現一次的的數字

異或的兩個值'相同為假,不同為真'。 交換兩個整數的值時可以不用第三個引數 a = a ^ b ^ a = b b = b ^ a ^ b = a 一個只出現一次的數字。 一個整型數組裡除了一個數字之外,其他的數字都出現了偶數次。請寫程式找出這個只出現一次的數字。 public int oneNum

數字訊號處理專題(2)——利用FPGA進行基本運算及特殊函式定點運算

一、前言   FPGA以擅長高速並行資料處理而聞名,從有線/無線通訊到影象處理中各種DSP演算法,再到現今火爆的AI應用,都離不開卷積、濾波、變換等基本的數學運算。但由於FPGA的硬體結構和開發特性使得其對很多演算法不友好,之前本人零散地總結和轉載了些基本的數學運算在FPGA中的實現方式,今天做一個系統的總

程式設計實現: 一組資料中只有一個數字出現了一次。其他所有數字都是成對出現的。 請找出這個數字。(使用運算

可以在指定陣列中找出只出現一次的元素 #include<stdio.h> int main() { int arr[] = { 1, 3, 4, 3, 1}; int i = 0; int len = sizeof(arr) / sizeof(ar

運算-LeetCode136-只出現一次的數字

題目 給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。 說明: 你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎? 示例 1: 輸入: [2,2,1] 輸出: 1 示例 2: 輸入: [4,1,2,1,2] 輸出:

計算一個二進位制數中數字“1”的個數(運算

int numberOfOne( unsigned value ) { int count; for( count = 0; value != 0; value >>= 1 ) if( ( value & 1 ) != 0 )//如果最低位是1,就增加計數器的

給定一個 32 有符號整數,將整數中的數字進行反轉。

class Solution: def reverse(self, x): “”" :type x: int :rtype: int “”" if x<=(pow(2,31)-1) and x>=pow(-2,31): c=abs(x) d=str©

LeetCode-136.只出現一次的數字(相關話題:運算

給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。 說明: 你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎? 示例 1: 輸入: [2,2,1] 輸出: 1 示例 2: 輸入: [4,1,2,1,2] 輸出

運算】找出陣列中,只出現一次的兩個數字

題目: 一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次,請寫程式找出這兩個出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1). 分析: 由於限制了複雜度,所以要用異或運算來解,什麼是異或? 首先,計算機1個位元組是8位(1Byte=8bit);其次,異

給定一個 32 有符號整數,將整數中的數字進行反轉(java實現最全面的)

題目:給定一個 32 位有符號整數,將整數中的數字進行反轉。示例 1:輸入: 123 輸出: 321 示例 2:輸入: -123 輸出: -321注意:假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−231,  231 − 1]。根據這個假設,如果反轉後的整數溢