正在學習計算機組織與結構,為了寫一些底層的算術操作模擬,比如乙個二進位制補碼數的加減乘除,發現這很麻煩,因為不管是什麼語言,都只提供了8位、32、64位等部分位數的補碼形式,那麼怎麼實現任意任意位的補碼整數呢,由於我們不能利用現有的如byte、integer類,所以我們需要乙個容器來儲存我們自己編寫的任意位的補碼整數。
陣列可以實現,但是陣列移位可能比較麻煩,比如如果要實現二進位制數的算術右移,必須要移動大部分元素。可以使用鍊錶,雖然獲取二進位制數某一位的值比較麻煩,但是還是比陣列可能更好一點。於是,我們採用基於鍊錶的佇列。
/*** created by xutao on 2018/12/1 15:26
* 作用:儲存乙個n位二進位制數,並實現左右移動、取反、求值等操作
/
public class binaryqueue}public binaryqueue(string binary)
}public void shiftleft()
temp = temp.next;}}
public void shiftright()
temp.next =null;
}public void shiftrightarithmetically()
temp.next =null;
}public binaryqueue reverse()
return bq;
}public binaryqueue add(binaryqueue bq)
string s_this = getstr();
for (int j =0 ;j
if (j
arr_this[j] = head.next.value;
}else }}
else
string s_bq = bq.getstr();
for (int j =0 ;j
if (j
arr_bq[j] = bq.head.next.value;
}else }}
//相加
int res = new int[len];
int carry = 0; //上一次加的進製
for (int i = len-1;i>=0;i--)
else if (res[i]==3)
else carry = 0;
}string str = "";
for (int i =0;i
str+=res[i];
}return new binaryqueue(str);
}public binaryqueue subtract(binaryqueue bq)
public binaryqueue getoppositenumber()
s+="1";
return reverse().add(new binaryqueue(s));//加一
}public int getint()
return integer.valueof(getstr(),2);
}public void set(int index,int value)
temp.value = value;
}public string getstr()
return str;
}public int getlast()
return temp.value;
}public static void main(string args)
//節點類
}class node
public int getvalue()
}
有了我們自己定義的任意的n位補碼二進位制數,那麼我們可以實現一些計算機底層的模擬了,比如布思演算法等等。
二進位制補碼
二進位制補碼 計算機儲存資料都是以0,1二進位制進行儲存。對於有符號整數儲存 對於浮點數待續 引入補碼概念。原碼即直接將真值轉換為其相應的二進位制形式,而反碼和補碼是對原碼進行某種轉換編碼方式。對於正整數,原碼,反碼和補碼都相一樣 對於負整數,補碼等於反碼加1,而反碼等於原碼除符號位不變其他位按位求...
二進位制補碼
計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的是十進位制,正如 亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘自 數學發展史 有空大家可以看看哦...
二進位制補碼
二進位制補碼主要是為了解決負整數的加減法運算 減法轉化為加法 原碼表示法就是用二進位制的最高位表示符號,0表示正數,1表示負數。以8位為例 1就是表示為0000 0001,1表示為1000 0001.而補碼的規則是正整數保持不變,針對負整數,除符號位外,其他位全部取反,然後 1。注 負整數中,原碼轉...