1. 程式人生 > >常用位操作的c++實現

常用位操作的c++實現

        看到這個標題,可能大家會誤解,其實就是貢獻幾個比較實用的運用位運算實現的操作,這對於加快程式的執行速度很有幫助。具體的實現是參考

   下面給出其函式宣告及其實現。

//判斷該整數是否是2的整數次方
bool IsPowerOfTwo (unsigned int value);
bool IsPowerOfTwo (int value);

//求以2為底的結果
unsigned int Log2OfPowerOfTwo (unsigned int powerOfTwo);
int Log2OfPowerOfTwo (int powerOfTwo);

//判斷兩個數是否異號
bool IsOppositeSigns(int value1,int value2);

//不使用分支計算絕對值
unsigned int GetAbs(int value);

//大於等於value的最近的二的次方的數
unsigned int NextPowerOfTwo(unsigned int value);

//實現
bool IsPowerOfTwo (unsigned int value)
{
    return (value > 0) && ((value & (value - 1)) == 0);
}

bool IsPowerOfTwo (int value)
{
    return (value > 0) && ((value & (value - 1)) == 0);
}

unsigned int Log2OfPowerOfTwo (unsigned int powerOfTwo)
{
    unsigned int log2 = (powerOfTwo & 0xAAAAAAAA) != 0;
    log2 |= ((powerOfTwo & 0xFFFF0000) != 0) << 4;
    log2 |= ((powerOfTwo & 0xFF00FF00) != 0) << 3;
    log2 |= ((powerOfTwo & 0xF0F0F0F0) != 0) << 2;
    log2 |= ((powerOfTwo & 0xCCCCCCCC) != 0) << 1;
    return log2;
}

int Log2OfPowerOfTwo (int powerOfTwo)
{
    unsigned int log2 = (powerOfTwo & 0xAAAAAAAA) != 0;
    log2 |= ((powerOfTwo & 0xFFFF0000) != 0) << 4;
    log2 |= ((powerOfTwo & 0xFF00FF00) != 0) << 3;
    log2 |= ((powerOfTwo & 0xF0F0F0F0) != 0) << 2;
    log2 |= ((powerOfTwo & 0xCCCCCCCC) != 0) << 1;
    return (int)log2;
}

bool IsOppositeSigns(int value1,int value2)
{
    return (value1 ^ value2) < 0;
}

unsigned int GetAbs(int value)
{
    unsigned int r;  // the result goes here
    int const mask = value >> (sizeof(int) * CHAR_BIT - 1);
    
    //r = (value + mask) ^ mask;
    //Patented variation:
    r = (value ^ mask) - mask;
    return r;
}

unsigned int NextPowerOfTwo(unsigned int value)
{
    value--;
    value |= value >> 1;
    value |= value >> 2;
    value |= value >> 4;
    value |= value >> 8;
    value |= value >> 16;
    value++;
    
    return value;
}
希望對大家有用


相關推薦

常用操作c++實現

        看到這個標題,可能大家會誤解,其實就是貢獻幾個比較實用的運用位運算實現的操作,這對於加快程式的執行速度很有幫助。具體的實現是參考   下面給出其函式宣告及其實現。//判斷該整數是否是2的

常用排序演算法C++實現

#ifndef SORT_H #define SORT_H class Sort { private: Sort(); Sort(const Sort&); Sort& operator = (const Sort&); te

OpneCV之影象的基本操作:形狀、通道分離/合併、影象混合、相加、操作——python實現

一、讀入圖片獲得畫素點的畫素值、改變畫素值、改變單個通道畫素值、獲得影象的行、列、影象資料型別、畫素點、ROI區域. import cv2 import numpy as np #讀取一個彩色影象 img = cv2.imread('C:/Users/NWPU/Desktop/1.jpg')

【資料結構】連結串列操作C實現

資料型別的定義 typedef int DataType; typedef struct ListNode { DataType data; struct ListNode *next; } ListNode; 連結串列的初始化和銷燬 連結串列的初

java常用操作

public class TestIndex { /** * 陣列越界 * 這個方法是java原始碼中常用的一個數組越界的判斷檢測 * 順便複習一下位操作 */ public static int read(byte[] b, in

MKL學習——基本操作C++實現

前言 前面介紹了各種向量-向量,矩陣-向量,矩陣-矩陣的函式簡介。根據自身目前狀況,主要使用實數域的操作,也就是說關注單精度float型別的s和雙精度double型別的d。還有就是用的基本都是全矩陣,沒有經過壓縮,也不是對稱、三角、帶狀的某一種情況。所以主要還

資料結構順序棧和鏈棧基本操作----c++實現

順序棧: #include<iostream> using namespace std; #define MaxSize 50 class SeqStack{ private: int

二叉樹的先序、中序、後序遍歷等基本操作c++實現

二叉樹:樹的每個節點最多有兩個子節點。1.實現二叉連結串列的結構://節點結構template<class T>struct  BinaryTreeNode{BinaryTreeNode<T>* _left;//左子樹BinaryTreeNode<

Lua BitOp 提供5.1和5.2版本操作運算 (跨平臺C語言實現 說明部分1)

BitOp作為The LuaJIT Project中的一個子專案。 Lua BitOp is a C extension module for Lua 5.1/5.2 which adds bitwise operations on numbers. Features 特點

c++ 操作實現資料標誌獲取與更新

<strong><span style="font-size:18px;">#include "stdafx.h" #include <iostream> usin

C語言中利用共用體、結構體、實現操作

編寫過51(MCU)程式的同學都知道51架構的MCU支援位操作,這是一個很方便的特性,在讀取/修改暫存器某位的值時非常方便快捷。但其他架構的MCU大多都不支援該特性,即不支援位操作,所在在對暫存器中某一位進行操作的時候都是and/or兩個操作共同使用,在編寫程式時非常麻煩。

C語言復習2之操作

位操作位操作 位操作是程序設計中對位模式按位或二進制數的一元和二元操作. 在許多古老的微處理器上, 位運算比加減運算略快, 通常位運算比乘除法運算要快很多. 在現代架構中, 情況並非如此:位運算的運算速度通常與加法運算相同(仍然快於乘法運算)。 位運算符 取反(~)是一元運算符, 對一個

C#操作Redis,C#實現Redis分布式鎖

ges mage c# png http 字符串 images red -s 功能描述 字符串常規操作 hashset操作 set操作 keys操作 分布式鎖操作 代碼截圖 購買詳詢:QQ 506023315,只要10元(屌絲籌房中) C#操作Red

求較大整數n的階乘,因為n較大時,n的階乘超出了正常類型的表示範圍,可以采用數組進行操作c實現

c語言 n階乘下面鏈接是java的實現,思路叫清晰點http://blog.51cto.com/6631065/2044441 #include <stdio.h> void Print_Factorial ( const int N ); int main() { int N; sc

C#實現的JS操作類實例

www. ora play gpo cursor help tran scrip 文件 本文實例講述了C#實現的JS操作類。分享給大家供大家參考。具體如下: 這個C#類封裝了常用的JS客戶端代碼操作,包括彈出對話框、返回上一頁,通過JS轉向,彈出警告框並轉向等。using

通過操作實現四則運算

test sub () return expect 意思 define 掌握 功能 在最早學習四則運算的過程中,我們其實就已經掌握了進制算法,這一次我將對二進制運用這個進制算法來實現四則運算。 四則運算 math.c /** * 功能:通過位操作實現四則運算 * 算法:

操作實現加減乘除四則運算

tle 參與 nbsp pre 圖片 操作數 整數 spa 或操作 解決方案 需要熟練掌握一些常見的位操作實現,具體為: 1)常用的等式:-n=~(n-1)=~n+1 2)獲取整數n的二進制中最後一個1:n&(-n)或者n&~(n-1)如:n=010100,

C# 實現保留兩小數的方法

decimal span digits con ring git string color tin 1、Math.Round(0.333333,2);//按照四舍五入的國際標準 2、double dbdata=0.335333; string str1=String.For

C++實現算法常用的STL---整理

快排 reat spa 快速 The 第一個元素 c++ 也會 else algorithm   sort快排 #include<algorithm> //註意包含algorithm頭文件 #include<iostream> using na

C語言常用庫函數實現

沖突 nbsp 常用 tr1 mov 一個 就會 || 參數 1.strcpy char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL))