1. 程式人生 > >位操作演算法的總結(一)

位操作演算法的總結(一)

本文參考《程式設計師面試金典》

1.位操作原理與技巧

第一組:

-x^000..000 = x ;
- x^111..111 = ~x;
- x^x = 0;

第二組:

  • x&000..000 = 0;
  • x&111..111 = x;
  • x&x = x;

第三組:

  • x|000..000 = x;
  • x|111..111 = 111..111;
  • x|x = x;

理解上述三組原理的含義,我們需要記住所有操作都是按位進行的,某一位的運算結果不會影響其餘位 。也就是說,只要上述語句對某一位成立,則同樣適用於一串位

2.常見的位操作

①:獲取某一位

假設獲取第r位(從右邊開始計數),我們將1開始左移r位,得到形如00010000..類似的串,然後執行位與

操作。

程式碼如下:

public boolean getBit(int num,int location)
{
    return ((num&(1<<location)!=0));
}

②:置位

先將1左移location位,接著用這個值和num進行“位或”操作,這樣只會改變i位的資料。

程式碼如下:

public int setBit(int num,int location)
{
    return num|(1<<location);
}

③:清零

與“置位”操作相反:

public int clearBit(int num,int
location) { return num&(~1<<location); } //下面是將num的最高位至i位清零的做法如下: public int clearBitsMSBthroughI(int num,int i) { int mask = (1<<i)-1; return num&mask; } //將第i位至最後一位清零做法: public int clearlowertoI(int num,int i ) { int mask = ~((1<<i)-1); return num&mask; }

3.一道試題

要求如下:

這裡寫圖片描述

分析:一個串中,增加了一個1,就得減少一個1,而增加1的那個位置如果高於減少的位置,那麼是滿足條件的略大值,否則就是略小值。其次,我們進行起始操作的位置,肯定是為0的位置。

import java.util.*;

public class CloseNumber {
    public int[] getCloseNumber(int x) {
        // write code here
        int[] a = new int[2];

        a[1] = getbig(x);
        a[0] = getsmall(x);

        return a;

    }

    public int getbig(int x)
        {
        int c0 = 0;
        int c11= 0;
        int temp1 = x;
        int temp2 = x;
        //得到拖尾0的個數
        while((temp1&1)==0&&(temp1!=0))
            {
            c0++;
            temp1>>=1;
        }
        //得到拖尾0左邊1的個數
        while(((temp1&1)==1)&&(temp1!=0))
            {
            c11++;
            temp1>>=1;
        }

        int p  =c0+c11;

        temp2|=(1<<p);  //最右邊非拖尾0置為1

        temp2&=~((1<<p)-1);//p右方所有位清零

        temp2|=(1<<(c11-1))-1;

        return temp2;

    }

    public int getsmall(int x)
        {

        int temp1 = x;
        int temp2 = x;

        int c1 = 0;//拖尾1的個數
        int c00 = 0;//拖尾1左邊連續0的個數

        while((temp1&1)==1){

            c1++;
            temp1>>=1;

        }

        while((temp1&1)==0&&(temp1!=0)){
            c00++;
            temp1>>=1;
        }

        int p = c1+c00;

        temp2&=((~0)<<(p+1));

        int mask = (1<<(c1+1))-1;

        temp2|=mask<<(c00-1);

        return temp2;        

    }
}

相關推薦

比較全面的Adaboost演算法總結

目錄: 1. Boosting演算法基本原理 2. Boosting演算法的權重理解 3. AdaBoost的演算法流程 4. AdaBoost演算法的訓練誤差分析 5. AdaBoost演算法的解釋 6. AdaBoost演算法的正則化 7. AdaBoost演算法的過

資料結構和演算法總結

任何一位有志於駕馭計算機的學生,都應該從這些方面入手,重點是:不斷學習,反覆練習,勤於總結。 究竟什麼是演算法呢?所謂演算法,是指基於特定的計算機模型,旨在解決某一問題而設計的一個指令序列。 演算法應具有以下流程:輸入與輸出;基本操作即加減乘除;確定性即明確的指令序列,可行性即可在對應計算機

基於Deep Learning的跟蹤演算法總結

博主最近主要關注使用深度學習的視訊跟蹤一系列演算法,本文為學習筆記,僅供學習交流,如有侵權,請指出。 No Free Lunch 不同於檢測、識別等視覺領域深度學習一統天下的趨勢,深度學習在目標跟蹤領域的應用並非一帆風順。其主要問題在於訓練資料的缺失。深

影象拼接演算法總結

影象的拼接技術包括三大部分:特徵點提取與匹配、影象配準、影象融合。 1、基於SRUF 的特徵點的提取與匹配 為了使拼接具有良好的精度和魯棒性,同時又使其具有較好的實時性,本實驗採用SURF 演算法完成影象序列特徵點的提取。 SURF 演算法又稱快速魯棒特徵,借鑑了SIFT

語義分割演算法總結

注: 在本文中經常會提到輸出資料的維度,為了防止讀者產生錯誤的理解,在本文的開頭做一下說明。 如上圖,原始影象大小為5*5,經過一次卷積後,影象變為3*3。那就是5*5的輸入,經過一個卷積層後,輸出的維度變為3*3,再經過一個卷積層,輸出的維度變為1*1

C# 操作word總結——建立文件和新增頁首頁尾

      最近程式中經常使用到word的操作,我在網上查了一些資料,在這裡整理一下。       使用程式碼建立word文件: #region 新建Word文件 /// <summary> /// 動態生成Word文件並填充內容 /// </summa

數學建模演算法總結

§1 線性規劃 在人們的生產實踐中,經常會遇到如何利用現有資源來安排生產,以取得最大經濟效益的問題。此類問題構成了運籌學的一個重要分支—數學規劃,而線性規劃(Linear Programming 簡記

排序演算法總結——選擇排序

選擇排序的基本宗旨就是每次選出剩餘元素中最大的或者最小放在最終排序的對應位置。 1.直接選擇排序 基本思想: 在a[1]-a[n-1]中選擇最小的元素和a[0]交換; 在a[2]-a[n-1]中選擇最小的元素和a[1]交換; …… 在a[i]-a[n

操作演算法總結

本文參考《程式設計師面試金典》 1.位操作原理與技巧 第一組: -x^000..000 = x ; - x^111..111 = ~x; - x^x = 0; 第二組: x&000..000 = 0; x&111..111 =

操作系統基礎知識總結

一個 快速 會有 處理死鎖 b2c fcm 死鎖 空間 存儲系統 1. 進程和線程的區別 進程 進程,即正在運行的程序,程序從硬盤載入到內存就變成進程。進程是資源的擁有者,每個進程都擁有著自己的內存空間與多個線程。 線程 線程是指令的執行者,是計算機執行指令的基本單元,一個

DOM操作總結

UNC 標簽 頁面加載 當前 urn 對象 自己的 var ole (一)innerText 凡是成對的標簽,中間的文本內容,設置的時候,都是用innerText這個屬性方法 (二)在某個元素的事件中,自己的事件中的this就是當前的這個元素對象 var btn=ducou

系統學習機器學習之總結--常見分類演算法優缺點

主要是參考網上各種資源,做了整理。其實,這裡更多的是從基礎版本對比,真正使用的時候,看資料,看改進後的演算法。 1. 五大流派 ①符號主義:使用符號、規則和邏輯來表徵知識和進行邏輯推理,最喜歡的演算法是:規則和決策樹 ②貝葉斯派:獲取發生的可能性來進行概率推理,最喜歡的演算法是:樸素貝葉

Photoshop操作總結

第一次用ps畫圖        在學習ps之前,我用ps軟體畫了一個圖(有些不忍直視嘻嘻),在學完之後,可以作一個比較,希望自己會有很大的進步。 透視 定義        繪畫理論

Oracle資料庫常用操作總結

--oracle cs架構軟體 --客戶端 --tns  --協議 --ip --埠 --資料庫名字 --監聽如果出了問題,先刪除所有監聽,再重建。netca。tns檔案中名字不能重複, --oracle預設自帶兩個管理員使用者 sys system 這兩個使用者在登入時

C++ 運算總結

    主要講解C++的位運算和位運算的作用。 1.按位與(&)     表示按位與: 1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0 用處:     保留某一位,用於判斷對應位資料是否為1。

七大排序演算法的個人總結

氣泡排序(Bubble Sort): 很多人聽到排序第一個想到的應該就是氣泡排序了。也確實,氣泡排序的想法非常的簡單:大的東西沉底,汽泡上升。基於這種思想,我們可以獲得第一個版本的冒泡: public static void sort1(int[] array) { for

資料結構與演算法學習總結

1.什麼是資料結構和演算法 資料結構,就是一組資料的儲存結構。演算法,就是操作資料的一組方法。資料結構是為演算法服務的,演算法要作用在特定的資料結構之上。 2.為什麼要學習資料結構和演算法? (1)對個人:資料結構和演算法是程式設計師的必修課程之一,能幫助我們寫出效能更

演算法學習——分治以及排序演算法總結

分治策略: 分解(Divide):將問題劃分為若干子問題 解決(Conquer):遞迴求解子問題 合併(combine):子問題組合成原問題 主方法:T(n) = aT(n/b)+f(n) 分解成a個問題,每個子問題降b倍,合併為O(f(n)) 主定理: 比

PS知識點大總結——基礎操作

PS的介面: 選單欄、屬性欄、工具欄、編輯區、活動面板 PS的功能: 影象處理(影樓後期、人像修復美化);排版(書籍、雜誌、噴繪、廣告);網頁、APP版面設計。 PS版本: CS2 3 4 5 6       CC (creative cloud)       CC 201

深度學習總結各種優化演算法

一.優化演算法介紹 1.批量梯度下降(Batch gradient descent,BGD) θ=θ−η⋅∇θJ(θ) 每迭代一步,都要用到訓練集的所有資料,每次計算出來的梯度求平均 η代表學習率LR 2.隨機梯度下降(Stochas