目錄
一、原碼
二、反碼
三、補碼
四、浮點數
五、位運算(& | ~ ^ <>)
一、& 與運算
二、| 或運算
三、~ 逐位取反(符號位除外)
四、^ 異或運算
五、<
六、 >> 右移運算
七、>>> 無符號右移
六、位運算應用
今天看到乙個演算法題,其中有乙個解法是通過位運算來提高效率的。然後寫這篇部落格來回憶與總結以下位運算的知識
例如: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 按位取反運算子 對資料的每個...