ใน Java ฉันสามารถกำหนดค่าคงที่จำนวนเต็มในรูปแบบไบนารีได้หรือไม่


86

เช่นเดียวกับวิธีที่คุณสามารถกำหนดค่าคงที่จำนวนเต็มเป็นเลขฐานสิบหกหรือฐานแปดฉันสามารถทำในฐานสองได้หรือไม่?

ฉันยอมรับว่านี่เป็นคำถามที่ง่าย (และโง่) จริงๆ การค้นหา Google ของฉันว่างเปล่า


2
เพียงแค่ FYI ในทุกภาษาการเขียนโปรแกรมสำนวนคือการเขียนค่าคงที่ไบนารีเป็นเลขฐานสิบหกไม่ใช่สตริงไบนารีที่แท้จริง
abyx

3
ถูกต้อง แต่ฉันคิดว่านั่นเป็นเพราะฐานสิบหกเป็นสิ่งที่ใกล้เคียงที่สุดไม่ใช่เพราะมีบางอย่างผิดปกติกับไบนารี ในภาษาที่ฉันเคยใช้ซึ่งสนับสนุนตัวอักษรไบนารีฉันไม่คิดว่าการประชุมจะเพิกเฉยต่อคุณลักษณะนี้
Ken


ปี 2017: คำตอบที่ได้รับการยอมรับจะต้องมาจาก Russ ดู: stackoverflow.com/a/1692932/716079
Lourenco

คำตอบ:


66

ดังนั้นด้วยการเปิดตัว Java SE 7 สัญกรณ์ไบนารีจึงเป็นมาตรฐานนอกกรอบ ไวยากรณ์ค่อนข้างตรงไปตรงมาและชัดเจนหากคุณมีความเข้าใจที่ดีเกี่ยวกับไบนารี:

byte fourTimesThree = 0b1100;
byte data = 0b0000110011;
short number = 0b111111111111111; 
int overflow = 0b10101010101010101010101010101011;
long bow = 0b101010101010101010101010101010111L;

และโดยเฉพาะอย่างยิ่งในประเด็นของการประกาศตัวแปรระดับคลาสเป็นไบนารีไม่มีปัญหาอย่างแน่นอนในการเริ่มต้นตัวแปรแบบคงที่โดยใช้สัญกรณ์ไบนารี:

public static final int thingy = 0b0101;

ระวังอย่าให้ตัวเลขมากเกินไปด้วยข้อมูลมากเกินไปมิฉะนั้นคุณจะได้รับข้อผิดพลาดของคอมไพเลอร์:

byte data = 0b1100110011; // Type mismatch: cannot convert from int to byte

ตอนนี้ถ้าคุณอยากจะแฟนซีจริงๆคุณสามารถรวมคุณสมบัติใหม่ ๆ ที่เป็นระเบียบใน Java 7 ที่เรียกว่าตัวอักษรตัวเลขที่มีขีดล่าง ดูตัวอย่างที่สวยงามเหล่านี้ของสัญกรณ์ไบนารีที่มีขีดล่างตามตัวอักษร:

int overflow = 0b1010_1010_1010_1010_1010_1010_1010_1011;
long bow = 0b1__01010101__01010101__01010101__01010111L;

ตอนนี้ไม่ดีและสะอาดไม่ต้องพูดถึงอ่านได้มาก?

ฉันดึงข้อมูลโค้ดเหล่านี้มาจากบทความเล็ก ๆ ที่ฉันเขียนเกี่ยวกับหัวข้อนี้ที่ TheServerSide อย่าลังเลที่จะตรวจสอบสำหรับรายละเอียดเพิ่มเติม:

Java 7 และสัญลักษณ์ไบนารี: การเรียนรู้การสอบ OCP Java Programmer (OCPJP)


3
ทำไมข้อมูลไบต์ของคุณ = 0b0000110011; มี 10 บิต? ฉันใหม่ในการเขียนโปรแกรม แต่ฉันคิดว่ามันควรจะดูเหมือน 0b00110011 เพื่อให้พอดีกับประเภทข้อมูล 8 ไบต์
Mike

1
สำหรับใครก็ตามที่สงสัยเช่นเดียวกับ Mike นั่นเป็นเพราะคอมไพลเลอร์แปลงเป็นตัวเลขที่แสดง - คุณอาจมีศูนย์นำหน้าหลายสิบตัวและจะไม่มีผลกับค่าจริง ขั้นตอนการรวบรวมเป็นหลักเหมือนกับว่าคุณเขียนทศนิยมไว้ที่นั่น
Luke Briggs

1
ตามนิยามไบต์ประเภทดั้งเดิมสามารถจัดเก็บ 256 ตัวเลขระหว่าง -128 ถึง 127 (-128 ถึง -1 & 0 ถึง 127) แต่วิธีการแทนค่า -128 โดยใช้ไบนารี สำหรับเช่น byte b = -0b1111111; หมายถึง -127 แต่แล้ว -128 ล่ะ?
nirmalsingh

152

ใน Java 7:

int i = 0b10101010;

ไม่มีไบนารีลิเทอรัลใน Java เวอร์ชันเก่า (ดูคำตอบอื่นสำหรับทางเลือกอื่น)


33
ฉันอยากจะชี้ให้เห็นว่าอาจมี_อักขระที่ทำให้ลำดับอ่านง่ายขึ้น: int i = 0b1010_1010_0011;
user12345613

@Russ 0b หมายถึงอะไรที่นี่? คุณลักษณะนี้เรียกว่าอะไรใน Java 7?
Geek

1
0b หมายถึงไบนารี คุณลักษณะนี้เรียกว่า binary literals: docs.oracle.com/javase/7/docs/technotes/guides/language/…
Russ Hayward

1
ชอบการแสดงข้อมูลไบนารีแบบใหม่นี้ การแทนค่าสตริงจะอ่านยากมาก ดูความแตกต่างของคำตอบที่ยอมรับและคำตอบจาก "@ user12345613" +1 สำหรับเขา
Marcello de Sales

54

ไม่มีตัวอักษรไบนารีใน Java แต่ฉันคิดว่าคุณสามารถทำได้ (แม้ว่าฉันจะไม่เห็นประเด็นก็ตาม):

int a = Integer.parseInt("10101010", 2);

1
ในการใช้งานอื่น ๆ รูปแบบ stippling สำหรับการแรสเตอร์เส้นและรูปหลายเหลี่ยมถูกระบุเป็นจำนวนเต็มในไลบรารีกราฟิกยอดนิยมหลายแห่ง การใช้ parseInt หรือ parseShort ช่วยให้นักพัฒนาสามารถมองเห็นรูปแบบได้อย่างง่ายดาย
charstar

5
ตั้งแต่ Java 7 คำตอบของ Russ Hayward คือคำตอบที่ถูกต้อง ก่อนหน้า Java 7 คุณสามารถใช้เครื่องมือออนไลน์หรือเครื่องคิดเลขที่คุณชื่นชอบเพื่อแปลงไบนารีเป็นหนึ่งในสัญกรณ์ที่ Java เวอร์ชันเก่า ๆ รู้จัก (ฐานแปดทศนิยมหรือเลขฐานสิบหก) หากใช้รัศมีอื่นสามารถใส่ข้อคิดเห็นเชิงพรรณนาที่มีการแทนค่าฐานสองไว้ที่การประกาศเพื่อชี้แจงค่าสำหรับผู้อ่าน
Jason C

นี่เป็นวิธีการแก้ปัญหาที่ค่อนข้างสกปรกใช่ไหม คุณแค่ใช้ 16 ไบต์เพื่อแทน 1 ไบต์ (ไม่นับอาร์กิวเมนต์ที่สองและการแปลง) แน่นอนเว้นแต่คอมไพเลอร์จะปรับสิ่งนี้ให้เหมาะสมซึ่งฉันสงสัย
Tomáš Zato - คืนสถานะ Monica

@ TomášZato: ใช่ แต่คุณจะแนะนำวิธีแก้ปัญหาใดเนื่องจากภาษาไม่สนับสนุนตัวอักษรไบนารีเมื่อฉันเขียนคำตอบนี้ Russ Hayward ควรได้รับคำตอบที่ยอมรับได้แล้ว
Ed S.

ฉันขอแนะนำให้เลิกใช้ความสะดวกสบายและใช้จำนวนเต็ม ในนิยามตัวแปรเองก็ใช้ได้ แต่คำตอบนี้อาจกระตุ้นให้ผู้ใช้ใช้แนวทางนี้สำหรับลูปเป็นต้นและโดยทั่วไปฉันคิดว่าโปรแกรมเมอร์ควรพยายามละทิ้งความสะดวกสบายของตัวเองเพื่อประสิทธิภาพบางอย่าง
Tomáš Zato - คืนสถานะ Monica

18

คำตอบจาก Ed Swangren

public final static long mask12 = 
  Long.parseLong("00000000000000000000100000000000", 2);

ใช้งานได้ดี ฉันใช้longแทนintและเพิ่มตัวปรับแต่งเพื่อชี้แจงการใช้งานที่เป็นไปได้ในรูปแบบบิตมาสก์ อย่างไรก็ตามมีความไม่สะดวกสองประการในแนวทางนี้

  1. การพิมพ์โดยตรงของศูนย์เหล่านั้นทั้งหมดมีโอกาสผิดพลาดได้ง่าย
  2. ผลลัพธ์ไม่สามารถใช้ได้ในรูปแบบทศนิยมหรือฐานสิบหกในช่วงเวลาของการพัฒนา

ฉันสามารถแนะนำแนวทางอื่นได้

public final static long mask12 = 1L << 12;

นิพจน์นี้ทำให้เห็นได้ชัดว่าบิตที่ 12 คือ 1 (การนับเริ่มจาก 0 จากขวาไปซ้าย) และเมื่อคุณวางเคอร์เซอร์ของเมาส์คำแนะนำเครื่องมือ

long YourClassName.mask12 = 4096 [0x1000]

ปรากฏใน Eclipse คุณสามารถกำหนดค่าคงที่ที่ซับซ้อนมากขึ้นเช่น:

public final static long maskForSomething = mask12 | mask3 | mask0;

หรืออย่างชัดเจน

public final static long maskForSomething = (1L<<12)|(1L<<3)|(1L<<0);

ค่าของตัวแปรmaskForSomethingจะยังคงมีอยู่ใน Eclipse ในขณะพัฒนา


ทางออกที่ยอดเยี่ยม! (public last static long mask12 = 1L << 12;)
Jyro117

17

การใช้ค่าคงที่ไบนารีในการกำบัง

ประกาศค่าคงที่:

public static final int FLAG_A = 1 << 0;
public static final int FLAG_B = 1 << 1;
public static final int FLAG_C = 1 << 2;
public static final int FLAG_D = 1 << 3;

และใช้มัน

if( (value & ( FLAG_B | FLAG_D )) != 0){
    // value has set FLAG_B and FLAG_D
}

12

ค้นหา "Java literals syntax" บน Google และคุณพบบางรายการ

มีไวยากรณ์เลขฐานแปด (นำหน้าหมายเลขของคุณด้วย 0) ไวยากรณ์เลขฐานสิบและไวยากรณ์เลขฐานสิบหกที่มีคำนำหน้า "0x" แต่ไม่มีไวยากรณ์สำหรับสัญกรณ์ไบนารี

ตัวอย่างบางส่วน:

int i = 0xcafe ; // hexadecimal case
int j = 045 ;    // octal case
int l = 42 ;     // decimal case

1
สิ่งนี้ไม่ตอบคำถาม
Michael McQuade

ปี 2017: โชคดีที่ไม่มีสัญกรณ์สำหรับการแสดงไบนารี เริ่มต้นด้วย "0b" ตัวอย่าง: byte b = 0b01000001(เพื่อการอ่านที่ดีขึ้นbyte b = 0b0100_0001)
Lourenco

2

หากคุณต้องการยุ่งเกี่ยวกับไบนารีจำนวนมากคุณสามารถกำหนดค่าคงที่ได้:

public static final int BIT_0 = 0x00000001;
public static final int BIT_1 = 0x00000002;

เป็นต้น

หรือ

public static final int B_00000001 = 0x00000001;
public static final int B_00000010 = 0x00000002;
public static final int B_00000100 = 0x00000004;

0

คำตอบที่น่าอึดอัดใจกว่าเล็กน้อย:

public class Main {

    public static void main(String[] args) {
        byte b = Byte.parseByte("10", 2);
        Byte bb = new Byte(b);
        System.out.println("bb should be 2, value is \"" + bb.intValue() + "\"" );
    }

}

ซึ่งเอาต์พุต [java] bb ควรเป็น 2 ค่าคือ "2"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.