第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何修復(fù)計算二進制數(shù)冪但經(jīng)常失敗的方法?

如何修復(fù)計算二進制數(shù)冪但經(jīng)常失敗的方法?

郎朗坤 2023-11-01 16:32:45
我一直在亂涂亂畫這段小代碼,它應(yīng)該計算并打印出 2 的哪些冪可以總結(jié)為給定的數(shù)字。它適用于小的奇數(shù),但當(dāng)我希望它計算偶數(shù)或更大的數(shù)時,它會丟失。我什至不知道我可以嘗試什么,代碼看起來不錯,但我可能一直沒有注意到。System.out.println("Give a number");    int gigaInt = si.nextInt();    String  gigaBit = Integer.toBinaryString(gigaInt);    String[] gigaBitArray = gigaBit.split(""); System.out.println("Binary: " + gigaBit); List<Integer> powers = new ArrayList<Integer>(); for(int counter = gigaBitArray.length-1; counter >= 0; counter--){        if (gigaBitArray[counter].equals("1"))            powers.add((int)Math.pow(2,counter));        else if(gigaBitArray[counter].equals("0")){            powers.add(0);        }    }    System.out.println("Powers: " + powers);所以,顯然,程序應(yīng)該計算冪,而且確實如此!在某些情況下...這里,當(dāng)給出 9給出一個數(shù)字 9 二進制:1001 冪:[8, 0, 0, 1]但是當(dāng)我希望它計算偶數(shù)時,它總是顯示“1”作為唯一的組成部分,如下所示:給出一個數(shù)字 8 二進制:1000 冪:[0, 0, 0, 1]每當(dāng)被要求處理一個大數(shù)字時,它就會變得完全瘋狂:給出一個數(shù)字 542 二進制:1000011110 冪:[0, 256, 128, 64, 32, 0, 0, 0, 0, 1]如果您對此提出任何建議,我將非常感激。這可能只是一個幼稚的錯誤,所以請指出。
查看完整描述

4 回答

?
慕尼黑5688855

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊

您的代碼的問題是您正在查看的數(shù)組索引。當(dāng)你輸入數(shù)字 8 時,它的二進制表示是 1000。當(dāng)你將它拆分成一個數(shù)組時,你會得到:

索引:0 1 2 3 值:1 0 0 0

因為您是從列表末尾開始,所以索引 0 將最后處理(并且與 2^0 相同)。

要解決此問題,您所需要做的就是反轉(zhuǎn)您正在查看的元素的順序,同時保持 for 循環(huán)的順序相同。例如:而不是:

gigaBitArray[counter]

它應(yīng)該是:

gigaBitArray[gigaBitArray.length -1 - counter]


查看完整回答
反對 回復(fù) 2023-11-01
?
蠱毒傳說

TA貢獻(xiàn)1895條經(jīng)驗 獲得超3個贊

您首先測試低位。如果您希望首先列出高階冪,則需要一個索引變量和一個冪變量。另外,無需檢查“0”。如果它不是“1”,那么它一定是“0”。


int iIndex;

int iLength = gigaBitArray.length;?

int iPower = iLength - 1;


for ( iIndex = 0; iIndex < iLength; ++iIndex, --iPower )

{

? ? if ( gigaBitArray[iIndex].equals("1") )

? ? {

? ? ? ? powers.add((int)Math.pow(2, iPower));

? ? }

? ? else

? ? {

? ? ? ? powers.add(0);

? ? }

}


查看完整回答
反對 回復(fù) 2023-11-01
?
斯蒂芬大帝

TA貢獻(xiàn)1827條經(jīng)驗 獲得超8個贊

0除了上面的兩個答案之外,您還可以通過將s 和s相乘來消除 if else 1:


int len = gigaBitArray.length;

for (int i = 0; i < gigaBitArray.length; i++) {

     powers.add((int)Math.pow(2, --len)*Integer.parseInt(gigaBitArray[i]));

}


查看完整回答
反對 回復(fù) 2023-11-01
?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗 獲得超6個贊

這是一種方法。代碼中的注釋不明顯。這里的想法是計算機內(nèi)的所有信息都是binary。字符和數(shù)字是根據(jù) 打印出來的context。由于所有信息都是二進制的,因此可以將shifted left or right位字段向相同方向移動。這允許檢測 a1或0bit,而無需求助于字符串操作的開銷。


      for (int number : new int[] { 8, 10, 23, 11, 2, 4, 99

      }) {

         List<Integer> powers = new ArrayList<>();


         // starting bits to shift

         int shift = 0;

         // save number for printout

         int save = number;


         while (number > 0) {

            // ANDing the number with 1 will mask the

            // low order bit to a 1 or 0.

            // Then shift that bit "shift" number

            // of bits (first time thru is 0) and store

            // the power in p. Then increment # of bits

            // to shift.

            int p = (number & 1) << shift++;


            //add power to beginning of list.

            powers.add(0, p);


            // now shift the number right by 1 to position

            // for next bit.

            number >>= 1;


         }


         System.out.printf("%3d -> %s%n", save, powers);


      }

上面打印出以下內(nèi)容:


  8 -> [8, 0, 0, 0]

 10 -> [8, 0, 2, 0]

 23 -> [16, 0, 4, 2, 1]

 11 -> [8, 0, 2, 1]

  2 -> [2, 0]

  4 -> [4, 0, 0]

 99 -> [64, 32, 0, 0, 0, 2, 1]


查看完整回答
反對 回復(fù) 2023-11-01
  • 4 回答
  • 0 關(guān)注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號