1. 程式人生 > >求模運算(%)和按位與運算(&)

求模運算(%)和按位與運算(&)

最近看了看HashMap原始碼,覺得裡面的一個按位與運算用的很優雅,記錄一下。

jdk7中,HashMap是“陣列+連結串列”的結構,為了讓HashMap裡的元素分佈的更加均勻,就要在陣列中給每個元素一個合適的位置,求模運算是一個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法如下:

static int indexFor(int h, int length) {
        return h & (length-1);
    }

是的,就是效率更高的按位與運算。這裡有一個前提,length是一個2的冪次方整數,這樣,length-1 的二進位制就是一個形如“0000111...”的數,比如,如果length=4

length-1=3,其二進位制表示為“0011”,如果length=8length-1=7,其二進位制表示為“0111”,以此類推。將hlength-1進行按位與運算的時候,由於高位都是0,只有低位的1才能決定最終的結果,就相當於對h進行相應數值(即length)的求模運算。

相關推薦

運算%運算&

最近看了看HashMap原始碼,覺得裡面的一個按位與運算用的很優雅,記錄一下。 jdk7中,HashMap是“陣列+連結串列”的結構,為了讓HashMap裡的元素分佈的更加均勻,就要在陣列中給每個元素一個合適的位置,求模運算是一個不錯的方法,但是,jdk7中使用了一種更加優雅的方法,原始碼中的方法

運算%運算&

最近看了看HashMap原始碼,覺得裡面的一個按位與運算用的很優雅,記錄一下。jdk7中,HashMap是“陣列+連結串列”的結構,為了讓HashMap裡的元素分佈的更加均勻,就要在陣列中給每個元素一個合適的位置,求模運算是一個不錯的方法,但是,jdk7中使用了一種更加優雅的

短路&&或 ||非短路&或 |的區別

static ole pri args 驗證 java system string rgs 短路與是JAVA語言中的一個邏輯運算符,記作&& A&&B, 當A為false時,不去計算B的值而直接返回false;當A為true時,計算B的值。

java編程之:運算,等運算規則

與運算 補碼 同時 復合 方法 amp 邏輯 例如 賦值 按位與運算符(&) 參加運算的兩個數據,按二進制位進行“與”運算。 運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:兩位同

邏輯或的區別

邏輯與或和按位與或的區別,按位與的符號和按位或的符號經過第一個條件就能判斷整個條件的真假,還要對第二個條件進行判斷,最後才2個結果結合起來判斷是真還是假。 邏輯與&& , 邏輯或 || 邏輯與&&表示的是交集,2個條件同時成立,結果才為真 邏輯或

巧用移位運算子輸出二進位制補碼

一 問題描述   給定任一整型值,輸出其二進位制補碼(即機器碼)。二 求解思路   整型值在機器中正是以二進位制補碼存放,在JAVA中,用print函式輸出的是其十進位制形式。&運算子會將兩邊的運算元按其二進位制形式逐個bit求與,並最終生成一個整型值(不同於邏輯與,

C++給定範圍進行運算

LeetCode上的題目: Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range,

讓hql支援運算

摘要: 目前hibernate不支援按位與運算,近期的專案又需要這樣的操作,好在hibernate提供了相關的擴充套件功能,能自己實現相關的操作 一、背景 工作中,使用的資料庫為MySQL,專案使用的語言為java,採用了JPA技術,底層用的是hiberna

[GX/GZOI2019]單調棧+運算

++ calc ide namespace class db4 names 圖片 d+ 首先看到與或,很顯然想到按照位拆分運算。然後就變成了0/1矩陣,要使矩陣在當前位與為1,則矩陣全為1,如果是或為1,則是矩陣不全為0,然後求全為0/1的矩陣個數即可。記錄c[i][j]表

運算之——&操作——快速取演算法

位運算之——按位與(&)操作——(快速取模演算法)   由於位運算直接對記憶體資料進行操作,不需要轉成十進

【AI基礎】python:openCV——圖像算術運算2運算

按位運算 openCV 按位運算 按位操作有:AND,OR,NOT,XOR 等。當我們提取圖像的 一部分,選擇非矩形 ROI 時這些操作會很有用,常用於Logo 投射。 本節操作思路:通過 threshold 函數將圖片 固定閾值二值化,定義:圖像的二值化,就是將圖像上的像素點的灰度值設置為0或25

劍指offer——不用加減乘除做加法異或

class Solution { public: int Add(int num1, int num2) { while(num2 != 0){//若需要進位 int sum = num1 ^ num2;//異或,01=1,00=0,11=

java 邏輯&&、&、邏輯或||、或|、異或^、左移右移的區別?

首先名稱是不同的 &&邏輯與  ||邏輯或  它們都是邏輯運算子 & 按位與  | 按位或  它們都是位運算子 if(a==1&&b==2) 這是說既要滿足a=1也要滿足b=2 if(a==

thinking in java test4.3練習12345用三元操作符操作來顯示二進位制

題目(1):寫一個程式,列印從1到100的值。 程式碼如下: public class Test4_3_1 { public static void main(String[] args){ for (int i = 0; i &

mysql 初體驗 -----資料的增刪改查

上篇隨筆說到了如何去安裝和 DOS命令 一些最簡單的操作,以及如何去鍵一個數據庫和如何建表。   這次接著來談mysql 裡資料和欄位的增刪改查 有增刪改查就會有資料型別以及資料型別的屬性 mysql資料型別和資料屬性有很多,先接觸一些最基本和最實用的的。   mysql 資料

carry4超前快速進邏輯結構比較器/加法器實現

先說一段廢話 近期萌生了寫技術部落格的念頭,一來是可以記錄一些遇到的技術問題,理清思路,也可以記錄自己的技術成長;二來是可以將自己的知識分享,以便後人再碰到時能從容不破。希望今後在碰到原創有價值的問題時能堅持這一習慣,也算是督促自己,下面進入正題。 問題的引出

Python或、異或、取反筆記

1. 按位與        按位與是針對二進位制數的操作,指將兩個二進位制數的每一位都進行比較,如果兩個相 應的二進位都為 1 則此位為 1,否則為 0。在本例中, 5 的二進位制表達為 101 , 3 的 二進位制表達為 11 (為補全位數進行按位操作寫作 011 ),則

排序演算法10——圖解基數排序優先法LSD優先法MSD

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

openssl 生成公鑰私鑰包含16進制公鑰

1. 生成原始 RSA私鑰檔案 rsa_private_key.pem openssl genrsa -out rsa_private_key.pem 1024 2. 將原始 RSA私鑰轉換為 pkcs8格式,JAVA需要使用的私鑰需要經過 PKCS8 編碼 openssl pkcs8 -top

關掉firefox火狐palemoon址列自動加www.字首功能

開啟firefox,在位址列輸入about:config 進入瀏覽器設定頁面,在過濾器中輸入 browser.fixup.alternate.prefix  ,這一選項就是管理修復位址列的url字首功能的