位運算的基礎知識 原碼 反碼 補碼等

2021-10-23 02:39:07 字數 3264 閱讀 9400

目錄

一、原碼

二、反碼

三、補碼

四、浮點數

五、位運算(&   |   ~  ^  <>)

一、& 與運算

二、| 或運算

三、~ 逐位取反(符號位除外)

四、^ 異或運算

五、<

六、 >> 右移運算

七、>>>  無符號右移

六、位運算應用

今天看到乙個演算法題,其中有乙個解法是通過位運算來提高效率的。然後寫這篇部落格來回憶與總結以下位運算的知識

例如:11的原碼為00001011 ,-11的原碼為10001011,其中一位符號位,七位資料位。

**實現(整數部分):  

public static void bytedata(int byte_length,int data)//其中byte_length代表著幾位

while(data!=0)//不斷除2

int middle_size=stack.size();

for(int i=middle_size+1;i<=byte_length-1;i++)//保留一位變成符號位

if(negative)

stack.push(1);

else

stack.push(0);

system.out.print("二進位制資料為:");

while(!stack.isempty())

system.out.print(stack.pop());

} public static void main(string args)

實現結果:

**實現(小數部分):

//小數部分處理

public static void float_data(float data)

while(math.abs(data-0.0)>0.000001)

else if(data<1)

arraylist.add(0);

else

}if(negative)

system.out.print("-0.");

for (int i = 0; i < arraylist.size(); i++)

}

執行結果:

就是原碼按位取反,注意符號位不動(對於負數而言,正數的原碼=反碼=補碼)

就是反碼+1,計算機中負數用補碼儲存(正數的原碼=反碼=補碼)。

在計算機中浮點數一般以ieee754的形式儲存。

即單精度浮點數字長32位,尾數長度23,指數長度8,指數偏移量127;

雙精度浮點數字長64位,尾數長度52,指數長度11,指數偏移量1023;

例如:   178.0625的ieee754形式表示過程如下

整數部分178 二進位制形式為10110010

小數部分  二進位制為0001

整體形式為 10110010.0001  將其標準化為1.01100100001*2^7 

那麼移碼變為7+127=134(二進位制形式為10110010)

最終格式變為了0 10110010  01100100001000000000000

(想到了當初考研的情形(>!

位運算規則 名稱

規則& 與運算 

二者全為1則為1,其餘為0       (與  相當於兩者同時成立)

|   或運算

二者之間有1則為1,其餘為0   (或 相當於兩者有乙個成立即可)

~   按位取反

除符號位外逐位取反 。

^  異或運算

兩者相同為0,不同為1  (異或  異代表不同的意思)

<

左移,移掉的省略,右邊補零。 相當於*2

>>  右移運算

右移,移掉的省略,正數左邊補0,負數左邊補1。相當於/2

>>> 無符號右移

將二進位制數按指定右移幾位,移掉的省略,左邊缺失的位,用0補齊

x&0=0

x&(-1)=x  (因為 -1對應為11111111)

x&x=x

x|(-1)  =-1  (因為-1對應的為11111111,那麼逐位或下來肯定為1111111,代表著-1)

x|x  =x 

~(-1)=0  (因為-1對應的為11111111,那麼逐位取反下來為100000,代表著0)

x^x=0

x^0=x

x^(~x)=-1  (因為~x 中 原來的1變為0,那麼與x中的值不同,產生1)

(記住任何數異或自己都為0;任何數異0都為本身;進行異或的數可以無序交換)

相當於*2     例如 5<<3 5x2³=40

相當於 /2   例如 -70>>2 -70÷2²=-18

l例如    -1>>>1   =2的31次方-1

一、判斷奇偶(奇數二進位制最後一位為1,偶數為0)

if((x&1)==0)

else

system.out.println("為奇數");

二、交換兩個數

void swap(a,b)
計算過程(看的別人的):

a=a^b

b=b^a=b^(a^b)=(b^b)^a=a --> b=a

a=a^b=(a^b)^b^(a^b)=(a^a)^(b^b)^b=b --> a=b

三、判斷正負(向右移31位獲取到符號位)

int b = a>>31 ,b=0則為正,b=1則為負
四、  取相反數:

a的相反數 ~a+1

五、取反

~n=-(n+1)

六、獲取整數n的二進位制串中最後乙個1

-n&n=~(n-1)&n

七、去除整數n的二進位制串中最後乙個1

n&(n-1)

原碼 補碼 反碼以及位運算

2 位運算 機器數是乙個數在計算機中的二進位制表示形式,機器數是帶符號的,在計算機中用乙個數的最高位 第一位 存放符號,正數為0,負數為1。例如1 帶符號即 1 在計算機中的最終表示形式為 0000 0001,依此類推 1的二進位制為 1000 0001。這種表示方式又叫做原碼,其中0的原碼為000...

基礎知識點 原碼, 反碼, 補碼

本篇文章講解了計算機的原碼,反碼和補碼.並且進行了深入探求了為何要使用反碼和補碼,希望本文對大家學習計算機基礎有所幫助 在學習原碼,反碼和補碼之前,需要先了解機器數和真值的概念.乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數...

位運算子,原碼 反碼 補碼

按位運算就把數字轉換為機器語言 二進位制的數字來運算的一種運算形式。按位與運算子 參與運算的兩個值,如果兩個相應位都為1,則該位的結果為1,否則為0 按位或運算子 參與運算的兩個值,只要其中有乙個為1,則該位結果就為1 按位異或運算子 當兩個對應的二進位相異時,結果為1 按位取反運算子 對資料的每個...