2
A
回答
0
所以,你將你的號碼存儲爲一個整數的數組,代表比特。 在附加的代碼示例中,您忘記了增加變量,並檢查它是否超出了數組的大小。
你可以寫這樣的事情(我假設數組的大小是):
for (i = 0; i < 5; i++)
{
if (array1[i] == 1)
array1[i] = 0;
else // we found a 0
array1[i] = 1;
break;
}
0
我不太清楚你在做什麼,但也許這將幫助:
#define countof(x) (sizeof(x)/sizeof(x[0]))
// an 8-bit number
int byte[8] = {0, 1, 1, 0, 1, 1, 1, 0}; // 1 = on, 0 = off
// flip all bits
for (size_t i = 0; i < countof(byte); ++i)
{
byte[i] = !byte[i];
}
// add one
for (size_t i = 0; i < countof(byte); ++i)
{
if (byte[i]) // if on
{
byte[i] = 0; // "add 1, reset to zero", and carry (no break)
}
else // if off
{
byte[i] = 1; // turn on
break; // nothing to carry, stop adding
}
}
(我不知道如何把你在正確的方向,而不只是解釋代碼,對不起,我覺得你也非常接近,這仍然是有幫助的。)
您會看到,當您添加一個時,如果該位已經是1,則將其重置爲零,然後沿着這些位繼續。如果該位爲零,則將其設置爲1,然後跳出循環。 (沒什麼可以隨身攜帶的,所以我們已經加入了。)
希望有所幫助。順便說一下,你會注意到這些位在上面的代碼中被「倒退」了。 LSB在索引0處。
2
您正在討論擴展算術。大多數處理器具有每次加法操作的執行結果和溢出結果,但C不提供對它們的訪問。
你的問題是,隨着數字變大,數字會變長。如果你處於最後一刻,而且需要執行,那麼你需要另外一點!這意味着你需要重新分配位數組(如果你使用的是數組)。
當然,更實際的解決方案是使用本地整數而不是單個位,因爲您的處理器已經很好地處理了二進制補碼。然後,您知道如果原始數字等於(unsigned) -1
,則將結果添加到結果中。根本問題依然存在;如果您需要執行最後的unsigned
,則需要分配另一個。
0
你可以做2的補在一個更簡單的方法類似波紋管:直到你找到一個1
- 去不變並繼續這樣做。如果MSB變爲0,則意味着溢出發生。
你可以自己檢查算法的有效性。和實施應該是這樣的波紋管:
// an 8-bit number
int number[8] = {0, 1, 1, 1, 0, 1, 0, 0};
int i;
bool gotFirstOne = false;
// flip bits after you first encountered an 1
for (i = 0; i < 8; i++)
{
if(gotFirstOne == false){
if(number[i] == 1) {
gotFirstOne = true;
}
}
else {
number[i] = !number[i];
}
}
if(number[7] == 0) {
printf("Overflow occurred");
}
乾杯!!!!
0
我回答2的補碼,記住這是12位補碼,你可以根據你的要求更改掩碼或整數類型。這是完美的工作,也可以使用宏來做到這一點。
int twos_compliment(unsigned short a)
{
int result;
result = 0x0FFF&a;
result = (((result&0x800)?(0<<11):(1<<11))|((result&0x400)?(0<<10):(1<<10))
|((result&0x200)?(0<<9):(1<<9))|((result&0x100)?(0<<8):(1<<8))
|((result&0x080)?(0<<7):(1<<7))|((result&0x040)?(0<<6):(1<<6))
|((result&0x020)?(0<<5):(1<<5))|((result&0x010)?(0<<4):(1<<4))
|((result&0x008)?(0<<3):(1<<3))|((result&0x004)?(0<<2):(1<<2))
|((result&0x002)?(0<<1):(1<<1))|((result&0x001)?0:1));
return result=result+1;
}
相關問題
- 1. 二進制補碼轉換
- 2. 轉換十進制轉換爲二進制補碼
- 3. 將十六進制轉換爲二進制和16位二進制補碼
- 4. 如何將補碼從二進制補碼轉換爲
- 5. 將十進制轉換爲二進制補碼,溢出
- 6. 將二進制補碼轉換爲十進制
- 7. 將十六進制(二進制補碼)轉換爲Java值
- 8. ESQL轉換爲二進制
- 9. 轉換爲二進制C++
- 10. 從十進制轉換爲二進制
- 11. 將二進制轉換爲十進制
- 12. 二進制轉換爲十進制 - understaing
- 13. 從二進制轉換爲十進制
- 14. 十六進制轉換爲二進制
- 15. 將十進制轉換爲二進制
- 16. 將八進制轉換爲二進制
- 17. 從二進制轉換爲十進制
- 18. 十六進制轉換爲二進制
- 19. 從符號幅度轉換爲二進制補碼
- 20. 使用java將32位二進制補碼轉換爲十進制數
- 21. 二進制補碼
- 22. 十進制轉換爲二進制的轉換
- 23. 十進制轉換爲二進制格式轉換
- 24. 十進制轉換爲二進制轉換不工作
- 25. 十進制轉換爲二進制轉換錯誤
- 26. 轉換32位二進制數轉換爲十進制
- 27. 轉換十進制轉換爲二進制矢量
- 28. 將十六進制轉換爲二進制,然後轉換爲十進制
- 29. 二進制轉換爲十六進制和十六進制轉換爲二進制
- 30. 將十進制轉換爲二進制和二進制轉換爲十進制的程序?
array []包含什麼? – WhirlWind 2010-04-05 21:54:01
爲什麼你需要將某些東西轉換成2s的恭維表示?我相信一切通常都是以這種方式存儲的。 – pajton 2010-04-05 21:54:24
請說清楚你在說什麼。這時很難理解你的問題。你「轉換爲二進制補碼」是什麼?爲什麼? – AnT 2010-04-05 21:56:17