جافا طباعة عدد ثنائي باستخدام بت الحكمة المشغل [مغلقة]

StackOverflow https://stackoverflow.com/questions/2784133

سؤال

مرحبا أنا خلق طريقة التي سوف تتخذ عددا وطباعته جنبا إلى جنب مع تمثيل ثنائي.المشاكل هي أن لي طريقة طباعة كافة 0 لأي رقم موجب ، و كل 1 من أجل أي عدد سالب

private static void display( int number ){

        System.out.print(number + "\t");        
        int mask = 1 << 31;

        for(int i=1; i<=32; i++) {
            if( (mask & number) != 0 )
                System.out.print(1);
            else
                System.out.print(0);


            if( (i % 4) == 0 )
                System.out.print(" ");

        }

    }

حصلت عليه:يعمل هذا:

/**
     * prints the 32-bit binary representation of a number
     * @param number the number to print
     */
    private static void display( int number ){
        //display number and a tab
        System.out.print(number + "\t");

        //shift number 31 bits left
        int mask = 1 << 31;

        //loop and print either 1 or 0
        for(int i=31; i>=0; i--) {
            if( ((1 << i)&number) != 0)
                System.out.print(1);
            else
                System.out.print(0);

            //every four bits print a space
            if( (i % 4) == 0 )
                System.out.print(" ");            

        }
        //print new line
        System.out.println();
    }
هل كانت مفيدة؟

المحلول

نسيت أن التحديث القناع:

    for(int i=1; i<=32; i++) {
        if( (mask & number) != 0 )
            System.out.print(1);
        else
            System.out.print(0);


        if( (i % 4) == 0 )
            System.out.print(" ");

        mask = mask >> 1;
    }

نصائح أخرى

نص السؤال تم تحرير مرات عديدة ، لذلك فمن الصعب أن نقول ما هو السؤال, ولكن هنا بعض الملاحظات.

على وقع مقابل غير موقعة التحول

واحد تنقيح السؤال يحتوي على هذا السطر:

int mask = 1 << 31;

إجابة واحدة تشير إلى أن ما كان مفقودا هو هذا السطر:

mask = mask >> 1;

هذا الواقع لن يجدي لأن >> هو وقع التحول ، ويؤدي إلى غير صحيحة mask قيمة لهذا الغرض (منذ أفرغت بت مليئة 1s).أي عدد سالب يمكن تحويلها إلى 32 بت, كل 1.

ما هو مطلوب هو غير صحيح التحول.

mask >>>= 1;

علما بأن مجمع الإحالة قد استخدمت الإيجاز.غير صحيح التحول >>> يملأ أفرغت بت مع 0.كما تستخدم هنا ، فإنه يضمن أن mask سوف يكون دائما واحدة فقط bit set, وهو ما هو مطلوب لهذه المشكلة.

انظر أيضا

مثل هذا السؤال


الحل البديل

هناك في الواقع أبسط حل لتحويل 32 بت int إلى 32 بت ، فصل في مجموعات من 4 بت.

static String zeroes(int length) {
    return (length <= 0) ? ""
      : String.format("%0" + length + "d", 0);
}
//...

int num = 8675309;

// convert to binary
String s = Integer.toBinaryString(num);
System.out.println(s);
// prints "100001000101111111101101"

// fill in leading zeroes
s = zeroes(Integer.SIZE - s.length()) + s;
System.out.println(s);
// prints "00000000100001000101111111101101"

s = s.replaceAll("(?!$)(?<=\\G.{4})", " ");
System.out.println("[" + s + "]");
// prints "[0000 0000 1000 0100 0101 1111 1110 1101]"

حتى لو كان هذا هو الواجب ، مجموعة متنوعة من التقنيات المستخدمة هنا يجب أن يكون لا يزال التعليمية.

انظر أيضا

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top