日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言位运算+乘法,关于c语言中的位运算。。。

發(fā)布時間:2025/3/11 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言位运算+乘法,关于c语言中的位运算。。。 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

標(biāo)簽:c++

位運(yùn)算是一種針對二進(jìn)制數(shù)的一種運(yùn)算

位運(yùn)算 共有六種

都有其對應(yīng)得操作符號

& ? ?? (and)? ? ? 位于

| ? ? ?? (or) ???? ?? 位或

~ ? ?? (not) ? ? ?? 取反

^?????? (xor) ? ? ?? 異或

>>??? (shr)??? 右移一位

<< ?? (shl)???? 左移一位

運(yùn)算說明:

=== 1. and運(yùn)算 ===

and運(yùn)算通常用于二進(jìn)制取位操作,例如一個數(shù) and 1的結(jié)果就是取二進(jìn)制的最末位。這可以用來判斷一個整數(shù)的奇偶,二進(jìn)制的最末位為0表示該數(shù)為偶數(shù),最末位為1表示該數(shù)為奇數(shù)。

相同位的兩個數(shù)字都為1,則為1;若有一個不為1,則為0。

00101

11100

(&;或者and)

----------------

00100

=== 2. or運(yùn)算 ===

or運(yùn)算通常用于二進(jìn)制特定位上的無條件賦值,例如一個數(shù)or 1的結(jié)果就是把二進(jìn)制最末位強(qiáng)行變成1。如果需要把二進(jìn)制最末位變成0,對這個數(shù)or 1之后再減一就可以了,其實(shí)際意義就是把這個數(shù)強(qiáng)行變成最接近的偶數(shù)。

相同位只要一個為1即為1。

00101

11100

(|或者or)

----------------

11101

=== 3. xor運(yùn)算 ===

異或的符號是⊕。按位異或運(yùn)算, 對等長二進(jìn)制模式按位或二進(jìn)制數(shù)的每一位執(zhí)行邏輯按位異或操作. 操作的結(jié)果是如果某位不同則該位為1, 否則該位為0.

xor運(yùn)算的逆運(yùn)算是它本身,也就是說兩次異或同一個數(shù)最后結(jié)果不變,即(a xor b) xor b = a。xor運(yùn)算可以用于簡單的加密,比如我想對我MM說1314520,但怕別人知道,于是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500,我就把20665500告訴MM。MM再次計算20665500

xor 19880516的值,得到1314520,于是她就明白了我的企圖。

相同位不同則為1,相同則為0。

00101

11100

(^或者xor)

----------------

11001

運(yùn)算結(jié)果

x

y

x

執(zhí)行了第一句后x變成了x # y。那么第二句實(shí)質(zhì)就是y

加法和減法互為逆運(yùn)算,并且加法滿足交換律。把#換成+,把@換成-,我們可以寫出一個不需要臨時變量的swap過程(Pascal)。

procedure swap(var a,b:longint);

begin

a:=a + b;

b:=a - b;

a:=a - b;

end;

好了,剛才不是說xor的逆運(yùn)算是它本身嗎?于是我們就有了一個看起來非常詭異的swap過程:

procedure swap(var a,b:longint);

begin

a:=a xor b;

b:=a xor b;

a:=a xor b;

end;

注意:位運(yùn)算版本的交換兩數(shù)不適用于一個數(shù)的自我交換。也就是說,如果上述程序的“b”改成“a”的話,其結(jié)果是變量a變成零。因此,在使用快速排序時,由于涉及到一個數(shù)的自我交換,因此如果要在其中使用位運(yùn)算版的交換兩數(shù)的話,應(yīng)該先判斷。具體的時間損耗在此略過。

=== 4. not運(yùn)算 ===

not運(yùn)算的定義是把內(nèi)存中的0和1全部取反。使用not運(yùn)算時要格外小心,你需要注意整數(shù)類型有沒有符號。如果not的對象是無符號整數(shù)(不能表示負(fù)數(shù)),那么得到的值就是它與該類型上界的差,因為無符號類型的數(shù)是用00到$FFFF依次表示的。下面的兩個程序(僅語言不同)均返回65535。

如果not的對象是有符號的整數(shù),情況就不一樣了,稍后我們會在“整數(shù)類型的儲存”小節(jié)中提到。

=== 5. shl運(yùn)算 ===

a shl b就表示把a(bǔ)轉(zhuǎn)為二進(jìn)制后左移b位(在后面添b個0)。例如100的二進(jìn)制為1100100,而110010000轉(zhuǎn)成二進(jìn)制是400,那么100 shl 2 = 400??梢钥闯?#xff0c;a shl b的值實(shí)際上就是a乘以2的b次方,因為在二進(jìn)制數(shù)后添一個0就相當(dāng)于該數(shù)乘以2。

通常認(rèn)為a shl 1比a * 2更快,因為前者是更底層一些的操作。因此程序中乘以2的操作請盡量用左移一位來代替。

定義一些常量可能會用到shl運(yùn)算。你可以方便地用1 shl 16 - 1來表示65535。很多算法和數(shù)據(jù)結(jié)構(gòu)要求數(shù)據(jù)規(guī)模必須是2的冪,此時可以用shl來定義Max_N等常量。

=== 6. shr運(yùn)算 ===

和shl相似,a shr b表示二進(jìn)制右移b位(去掉末b位),相當(dāng)于a除以2的b次方(取整)。我們也經(jīng)常用shr 1來代替div 2,比如二分查找、堆的插入操作等等。想辦法用shr代替除法運(yùn)算可以使程序效率大大提高。最大公約數(shù)的二進(jìn)制算法用除以2操作來代替慢得出奇的mod運(yùn)算,效率可以提高60%。

因為是最底層的運(yùn)算? 所以相對常規(guī)運(yùn)算 計算時間能減少很多

位運(yùn)算加速技巧

1. 如果乘上一個2的倍數(shù)數(shù)值,可以改用左移運(yùn)算(Left Shift) 加速 300%

x = x * 2;

x = x * 64;

//改為:

x = x << 1; // 2 = 21

x = x << 6; // 64 = 26

2. 如果除上一個 2 的倍數(shù)數(shù)值,可以改用右移運(yùn)算加速 350%

x = x / 2;

x = x / 64;

//改為:

x = x >> 1;// 2 = 21

x = x >> 6;// 64 = 26

3. 數(shù)值轉(zhuǎn)整數(shù)加速 10%

x = int(1.232)

//改為:

x = 1.232 >> 0;

4. 交換兩個數(shù)值(swap),使用 XOR 可以加速20%

var t:int = a;

a = b;

b = t;

//equals:

a = a^b;

b = a^b;

a = a^b;

5. 正負(fù)號轉(zhuǎn)換,可以加入 300%

i = -i;

//改為

i = ~i + 1; // NOT 寫法

//或

i = (i ^ -1) + 1; // XOR 寫法

6. 取余數(shù),如果除數(shù)為 2 的倍數(shù),可利用 AND 運(yùn)算加速 600%

x = 131 % 4;

//equals:

x = 131 & (4 - 1);

7. 利用 AND 運(yùn)算檢查整數(shù)是否為 2 的倍數(shù),可以加速 600%

isEven = (i % 2) == 0;

//equals:

isEven = (i & 1) == 0;

8. 加速 Math.abs 600% 的寫法1,寫法2 又比寫法1加速 20%

//寫法1

i = x < 0 ? -x : x;

//寫法2

i = (x ^ (x >> 31)) - (x >> 31);

//寫法3

i=x^(~(x>>31)+1)+(x>>31);

9. 比較兩數(shù)值相乘之后是否擁有相同的符號,加速 35%

eqSign = a * b > 0;

//equals:

eqSign = a ^ b > 0;

標(biāo)簽:c++

原文:http://blog.csdn.net/axuan_k/article/details/38371985

總結(jié)

以上是生活随笔為你收集整理的c语言位运算+乘法,关于c语言中的位运算。。。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。