เช่นเดียวกับวิธีที่คุณสามารถกำหนดค่าคงที่จำนวนเต็มเป็นเลขฐานสิบหกหรือฐานแปดฉันสามารถทำในฐานสองได้หรือไม่?
ฉันยอมรับว่านี่เป็นคำถามที่ง่าย (และโง่) จริงๆ การค้นหา Google ของฉันว่างเปล่า
เช่นเดียวกับวิธีที่คุณสามารถกำหนดค่าคงที่จำนวนเต็มเป็นเลขฐานสิบหกหรือฐานแปดฉันสามารถทำในฐานสองได้หรือไม่?
ฉันยอมรับว่านี่เป็นคำถามที่ง่าย (และโง่) จริงๆ การค้นหา Google ของฉันว่างเปล่า
คำตอบ:
ดังนั้นด้วยการเปิดตัว 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)
ใน Java 7:
int i = 0b10101010;
ไม่มีไบนารีลิเทอรัลใน Java เวอร์ชันเก่า (ดูคำตอบอื่นสำหรับทางเลือกอื่น)
_
อักขระที่ทำให้ลำดับอ่านง่ายขึ้น: int i = 0b1010_1010_0011;
ไม่มีตัวอักษรไบนารีใน Java แต่ฉันคิดว่าคุณสามารถทำได้ (แม้ว่าฉันจะไม่เห็นประเด็นก็ตาม):
int a = Integer.parseInt("10101010", 2);
คำตอบจาก Ed Swangren
public final static long mask12 =
Long.parseLong("00000000000000000000100000000000", 2);
ใช้งานได้ดี ฉันใช้long
แทนint
และเพิ่มตัวปรับแต่งเพื่อชี้แจงการใช้งานที่เป็นไปได้ในรูปแบบบิตมาสก์ อย่างไรก็ตามมีความไม่สะดวกสองประการในแนวทางนี้
ฉันสามารถแนะนำแนวทางอื่นได้
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 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
}
ค้นหา "Java literals syntax" บน Google และคุณพบบางรายการ
มีไวยากรณ์เลขฐานแปด (นำหน้าหมายเลขของคุณด้วย 0) ไวยากรณ์เลขฐานสิบและไวยากรณ์เลขฐานสิบหกที่มีคำนำหน้า "0x" แต่ไม่มีไวยากรณ์สำหรับสัญกรณ์ไบนารี
ตัวอย่างบางส่วน:
int i = 0xcafe ; // hexadecimal case
int j = 045 ; // octal case
int l = 42 ; // decimal case
byte b = 0b01000001
(เพื่อการอ่านที่ดีขึ้นbyte b = 0b0100_0001
)
หากคุณต้องการยุ่งเกี่ยวกับไบนารีจำนวนมากคุณสามารถกำหนดค่าคงที่ได้:
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;
คำตอบที่น่าอึดอัดใจกว่าเล็กน้อย:
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"