มีวิธีที่ดีกว่าในการเขียน v = (v == 0 หรือไม่ 1: 0); [ปิด]


465

ฉันต้องการสลับตัวแปรระหว่าง 0 ถึง 1 ถ้าเป็น 0 ฉันต้องการตั้งค่าเป็น 1 มิฉะนั้นถ้าเป็น 1 ฉันต้องการตั้งค่าเป็น 0

นี่เป็นการดำเนินการขั้นพื้นฐานที่ฉันเขียนบ่อยครั้งที่ฉันต้องการตรวจสอบวิธีที่สั้นและชัดเจนที่สุดเท่าที่จะทำได้ นี่คือสิ่งที่ดีที่สุดของฉัน:

v = (v == 0 ? 1 : 0);

คุณสามารถปรับปรุงสิ่งนี้ได้ไหม

แก้ไข: คำถามกำลังถามวิธีการเขียนคำสั่งด้านบนในตัวละครน้อยที่สุดในขณะที่รักษาความชัดเจน - นี่คือ 'ไม่ใช่คำถามจริง' อย่างไร นี่ไม่ได้มีไว้เพื่อการฝึกหัดรหัสกอล์ฟ แต่มีคำตอบที่น่าสนใจบางอย่างที่ออกมาจากผู้คนที่เข้ามาใกล้เหมือนกอล์ฟ - เป็นเรื่องดีที่ได้เห็นการใช้กอล์ฟในลักษณะที่สร้างสรรค์และกระตุ้นความคิด


20
มันดูเรียบง่าย / ชัดเจน / สั้นสำหรับฉัน
ม็อบ

136
เล่ห์เหลี่ยม:v = +!v;
jAndy

48
หาก 'ดีกว่า' ยังหมายถึง 'เร็วกว่า': jsperf.com/v-0-1-0
pimvdb

7
@Mobinga: +1 นี่เป็นเรื่องง่ายอย่างที่ควรจะเป็น คำตอบอื่น ๆ ทั้งหมดที่ฉันเห็นสับสนและบางคนเปลี่ยนตรรกะ แนะนำข้อบกพร่อง
เอียนบอยด์

8
@holodoc ทางออกที่ดีกว่าในการแสดงความคิดเห็นของคุณคือการสร้างคำตอบที่บอกว่าคุณรู้สึกว่าต้นฉบับเป็นวิธีที่ดีที่สุดและอธิบายอย่างละเอียดว่าทำไมคุณถึงรู้สึกว่าเป็นเช่นนั้น ที่ทำให้ผู้อื่นสามารถตอบคำถามของคุณได้อย่างง่ายดายด้วยการโหวต
Chuck van der Linden

คำตอบ:


721

คุณสามารถใช้:

v = 1 - v;

แน่นอนว่าสมมติว่าตัวแปรนั้นเริ่มต้นอย่างถูกต้องนั่นคือมันมีค่า 0 หรือ 1 เท่านั้น

วิธีอื่นที่สั้นกว่า แต่ใช้ตัวดำเนินการทั่วไปที่น้อยกว่า:

v ^= 1;

แก้ไข:

ต้องมีความชัดเจน; ฉันไม่เคยเข้าหาคำถามนี้ในฐานะนักกอล์ฟเพียงเพื่อหาวิธีสั้น ๆ ในการทำงานโดยไม่ต้องใช้เทคนิคที่คลุมเครือเช่นผลข้างเคียงของผู้ปฏิบัติงาน


206
นี่คือเส้นของรหัสที่สวยงามเช่นแก้วที่ตัดอย่างประณีตหรือกล้วยไม้ที่ออกดอกยาก ฉันชอบวิธีที่คุณเข้าถึงผ่านเลเยอร์ตรรกะและจัดการโดยตรงกับคณิตศาสตร์ของ 1 และ 0 ด้วยการดำเนินการที่เหมาะสมที่สุดที่เป็นไปได้ ฉันจะใช้สิ่งเหล่านี้ในโครงการของตัวเอง แต่น่าเสียดายที่เมื่อฉันต้องการให้ผู้ร่วมงานเข้าใจรหัสฉันจะต้องใช้วิธีการที่อิงกับตรรกะมากกว่า ขอบคุณแม้ว่าคำตอบของคุณทำให้วันของฉัน
Ollie Glass

37
คุณสามารถเพิ่มความคิดเห็นได้ตลอดเวลาว่าโค้ดทำอะไร
Prusse

25
@ เควิน: มันไม่เป็นความจริงที่ชัดเจนนี้ไม่ตอบคำถามตามที่ถาม q พูดว่า "ฉันต้องการสลับตัวแปรระหว่าง 0 ถึง 1" การตีความที่สมเหตุสมผลมากคือสิ่งนี้หมายความว่าค่าของตัวแปรนั้นเป็น 0 หรือ 1 อยู่แล้วการตีความ / ข้อ จำกัด นี้ได้อธิบายไว้อย่างชัดเจนในคำตอบ คุณจะคัดค้านอะไรในโลก
LarsH

50
@ แมทธิวที่จะบอกว่าคนที่ไม่v ^= 1ชัดเจนควรหยุดการเขียนโปรแกรมจะรุนแรงเล็กน้อยฉันคิดว่า v = v ^ 1ตามที่ระบุไว้ก่อนหน้านี้ไม่ได้เป็นหนึ่งในผู้ประกอบการร่วมกันมากขึ้นและจะไม่ทำในสิ่งเดียวกับ ตัวดำเนินการหมายถึงบางสิ่งที่แตกต่างอย่างสิ้นเชิงในภาษาที่แตกต่างกัน (VB) ใช่การค้นหาอย่างรวดเร็วจะบอกคุณว่าเป็นผู้ดำเนินการ XOR และคุณจะเข้าใจในสิ่งที่มันกำลังทำอยู่ ฉันไม่คิดว่านั่นหมายความว่าคุณต้องออกจากงานของคุณ
JD Isaacks

80
หากคุณบันทึก 15 ตัวอักษรโดยเขียนสิ่งนี้ แต่ใช้ความคิดเห็น 40 ตัวเพื่ออธิบายมันเป็นการปรับปรุงจริงหรือ
Michael Myers

343

เนื่องจาก0เป็นfalseค่าและ1เป็นtrueค่า

v = (v ? 0 : 1);

หากคุณมีความสุขที่จะใช้trueและfalseแทนตัวเลข

v = !v;

หรือถ้าพวกเขาจะต้องเป็นตัวเลข:

v = +!v; /* Boolean invert v then cast back to a Number */

55
เพียงแค่ใส่มายากลก่อนหน้านั้น+ !โอ้โหที่ดูสกปรกมาก! แต่เท่: p
jAndy

1
@Quentin - นี้จะแบ่งรหัสของผู้ชายถ้าเขามีswitch(v){ case 0 ...หรือ (V == 0) หรือ 0. ถ้าวี === คุณกำลังเปลี่ยนผลของเขานอกเหนือไปจากวิธีการของเขา .... ถ้า
ไบรอัน

34
({v :+! v}).vทำให้ยิ้มของมัน:
pimvdb

17
@Brian: ไม่ได้มี+สัญลักษณ์วิเศษ! ¯ \ _ (ツ) _ / ¯
jAndy

11
+1 สำหรับv = (v ? 0 : 1)JS ที่ชัดเจนและเป็นสำนวน
Bennett McElwee

200

v = (v + 1) % 2และถ้าคุณต้องการเพื่อวงจรผ่านค่าอื่น ๆ อีกมากมายเพียงแค่เปลี่ยนสำหรับ2 (n + 1)สมมติว่าคุณต้องรอบ 0,1,2 v = (v + 1) % 3เพียงแค่ทำ


2
ฉันรักวงจร! มันฉลาดจริงๆ
Ollie Glass

16
+1 สำหรับการคิดเกี่ยวกับการสลับเป็นวงจร ง่าย ๆ เมื่อพิจารณาว่ามันยืดหยุ่นแค่ไหน
Guffa

3
+1 สำหรับการจัดหาโซลูชันแบบแยกส่วนที่แข็งแกร่งเช่นกัน ในทางปฏิบัติคุณอาจต้องการใช้constตัวแปรแทนที่ตัวเลขอาถรรพ์ 2, 3, ...
oosterwal

2
วิธีที่สั้นกว่า (แฮกเกอร์): ++v % 3หากคุณต้องการวนรอบ 0, 1, 2
haraldmartin

75

คุณสามารถเขียนฟังก์ชั่นและใช้งานได้เช่น:

v = inv(v)


30
+1 ฉันเห็นด้วยอย่างยิ่งว่านี่เป็นคำตอบที่สะอาดที่สุด (... แต่แล้วสิ่งที่จะเกิดขึ้นในinvฟังก์ชั่น: P)
Lea Hayes

4
ฉันหวังว่าฉันจะตอบคำถามนี้ได้มากกว่า +1 หากรหัสทั่วไปไม่สามารถมองเห็นได้อย่างชัดเจนมันควรจะถูกห่อหุ้มด้วยฟังก์ชั่นที่มีชื่ออธิบาย
TehShrike

11
@TehShrike คุณคิดว่าinvเป็นชื่อที่สื่อความหมายหรือไม่?
Bennett McElwee

3
@Bennett McElwee: inv = invert ดูเหมือนจะเป็นตัวย่อทั่วไปสำหรับฉันเสมอ
แดเนียล

51
ทำไมตัวย่อจึงเรียกว่า 'สลับ' หรือ 'สลับ' และให้โค้ดอ่านได้ มันไม่เหมือนกับว่าเราพยายามใส่สิ่งนี้ลงใน punchcard 80 คอลัมน์หรือบางอย่าง
Chuck van der Linden

50

หากคุณไม่สนใจความเป็นไปได้อื่น ๆ นอกจาก 1:

v = v ? 0 : 1;

ในกรณีข้างต้น v จะกลายเป็น 1 ถ้า v เป็น 0, false, undefined หรือ null ระวังการใช้วิธีการนี้ - v จะเป็น 0 แม้ว่า v คือ "สวัสดีโลก"


2
นั่นจะไม่พลิกค่า v = v ? 0 : 1คุณหมายถึง
Guffa

3
@Guffa - +1 สำหรับการจับ dyslexia ของฉัน ...
Brian

3
นี่เป็นคำตอบเชิงตรรกะที่ฉันชอบซึ่งฉันสามารถใช้กับเพื่อนร่วมงานได้ (ฉันเห็นคำตอบของ @ Guffa เป็นตัวเลข) ฉันชอบวิธีที่คุณได้ทำการทดสอบที่ไม่จำเป็น (v == 0) และวงเล็บออกมาทำให้เหลือจำนวนอักขระต่ำสุดที่แน่นอน ขอบคุณ.
Ollie Glass

1
ฉันเป็นแฟนตัวยงของ @ คำตอบ Guffa เกินไป - ในคำพูดของ Lynard skynard ที่เก็บไว้คนเรียบง่าย;)
ไบรอัน

2
+1 สำหรับการทำความเข้าใจค่า "ความจริง"
zzzzBov

44

เส้นชอบv = 1 - vหรือv ^= 1หรือv= +!vทั้งหมดจะได้งานทำ แต่พวกเขาเป็นสิ่งที่ผมจะเรียกว่าแฮ็ก สิ่งเหล่านี้ไม่ใช่เส้นรหัสที่สวยงาม แต่เป็นเทคนิคราคาถูกที่มีผลกระทบตามที่ตั้งใจไว้ 1 - vไม่สื่อสาร "สลับค่าระหว่าง 0 และ 1" สิ่งนี้ทำให้รหัสของคุณแสดงออกน้อยลงและแนะนำสถานที่ (แม้ว่าจะเป็นจุดเล็ก ๆ ) ซึ่งนักพัฒนารายอื่นจะต้องแยกวิเคราะห์รหัสของคุณ

แทนที่จะมีฟังก์ชั่นเช่นv = toggle(v)การสื่อสารความตั้งใจได้อย่างรวดเร็ว


8
-1 อย่างจริงจังv=1-vไม่สื่อสารสลับ
Blindy

22
1-vสามารถสื่อสารสลับได้อย่างแน่นอน แต่นั่นเป็นสิ่งเดียวที่สื่อสารได้ ยกตัวอย่างเช่นมันยังสามารถสื่อสารบรรทัดกับศูนย์ที่หรือการเปลี่ยนแปลงที่มิเรอร์ศูนย์กลางที่v=1 v=0.5ในแง่นี้มันค่อนข้างคลุมเครือ มันเป็นความจริงที่การรู้ว่าvสามารถจำกัด0หรือ1จำกัดความหมายของมัน แต่บังคับให้นักพัฒนาคนอื่น (หรือตัวคุณในอนาคตของคุณ) เข้าใจบริบทนั้นก่อนที่จะสามารถเข้าใจบรรทัดง่าย ๆ นี้ได้ คุณจะไม่ชัดเจนกว่านี้มากนักv = toggle(v)
เรย์

10
v ^= 1ชัดเจนอย่างสมบูรณ์ถ้าคุณเข้าใจการดำเนินการทางตรรกะซึ่งคุณจะดีกว่าถ้าคุณเป็นโปรแกรมเมอร์ ฉันคิดว่านั่นคือความแตกต่างระหว่างสิ่งนั้นกับv=1-v; การดำเนินการเชิงตรรกะและการคำนวณทางคณิตศาสตร์และเรากำลังพยายามแสดงแนวคิดเชิงตรรกะไม่ใช่การคำนวณทางคณิตศาสตร์
Matthew อ่าน

6
@ Matthew อ่าน: นี่เป็นข้อความที่ยอดเยี่ยมซึ่งสรุปความคิดของฉันได้ดี: "เรากำลังพยายามแสดงแนวคิดเชิงตรรกะไม่ใช่คณิตศาสตร์" แม้ว่าจะv ^= 1มีความกำกวมอยู่บ้าง แต่ก็สามารถตีความได้ว่าเป็น bitwise-xor
เรย์

6
สำหรับโปรแกรมเมอร์ (และใช่ฉันหมายถึงคนที่ชอบเรา) สิ่งเหล่านี้ค่อนข้างชัดเจน พวกเขาไม่ได้แฮ็คเพราะมันเป็นโซลูชั่นที่สง่างามเนื่องจากความเรียบง่าย
gion_13

38

( ความซื่อสัตย์และความซื่อสัตย์ทางคณิตศาสตร์ - ได้รับจำนวนคะแนนใน "คำตอบ" นี้ทำให้ฉันแก้ไขคำตอบนี้ฉันออกไปนานเท่าที่จะทำได้เพราะมันตั้งใจให้สั้นและไม่เป็นอะไร "ลึก" คำอธิบายใด ๆ ที่ตรงกันข้ามกับวัตถุประสงค์อย่างไรก็ตามความคิดเห็นทำให้ชัดเจนว่าฉันควรชัดเจนเพื่อหลีกเลี่ยงความเข้าใจผิด )

คำตอบเดิมของฉัน:

ถ้อยคำของข้อกำหนดส่วนนี้:

ถ้าเป็น 0 ฉันต้องการตั้งค่าเป็น 1 มิฉะนั้นตั้งเป็น 0

หมายความว่าทางออกที่ถูกต้องที่สุดคือ:

v = dirac_delta(0,v)

ก่อนอื่นสารภาพ: ฉันทำให้ฟังก์ชั่นเดลต้าสับสน Kronecker delta น่าจะเหมาะสมกว่าเล็กน้อย แต่ไม่มากเท่าที่ฉันต้องการบางสิ่งบางอย่างที่ไม่ขึ้นกับโดเมน แต่ฉันไม่ควรใช้ฟังก์ชันเดลต้าเลยจริง ๆ ฉันควรพูดว่า:

v = characteristic_function({0},v)

ให้ฉันอธิบาย จำได้ว่าฟังก์ชั่นเป็นสาม(X, Y, ฉ)ที่XและYเป็นชุด (เรียกว่าโดเมนและโคโดเมนตามลำดับ) และFคือกฎที่กำหนดองค์ประกอบของYกับองค์ประกอบของแต่ละX เรามักจะเขียนสาม(X, Y, ฉ)เป็นf: X → Y รับเซตย่อยของXพูดAมีฟังก์ชั่นพิเศษซึ่งเป็นฟังก์ชั่นχ A : X → {0,1}(มันอาจจะคิดว่าเป็นฟังก์ชั่นกับโคโดเมนขนาดใหญ่เช่นℕหรือℝ) ฟังก์ชั่นนี้ถูกกำหนดโดยกฎ:

χ (x) = 1ถ้าx ∈และχ (x) = 0ถ้าx ∉

หากคุณชอบตารางความจริงมันเป็นตารางความจริงสำหรับคำถาม "องค์ประกอบxของXเป็นองค์ประกอบของชุดย่อยAหรือไม่"

ดังนั้นจากคำนิยามนี้ก็เป็นที่ชัดเจนว่าลักษณะการทำงานเป็นสิ่งที่จำเป็นที่นี่กับXชุดใหญ่บางมี 0 และA = {0} นั่นคือสิ่งที่ฉันควรจะเขียน

และเพื่อฟังก์ชั่นเดลต้า สำหรับสิ่งนี้เราจำเป็นต้องรู้เกี่ยวกับการรวม ไม่ว่าคุณจะรู้หรือไม่ก็ตาม หากคุณไม่ทำสิ่งที่ฉันสามารถพูดได้ที่นี่จะบอกคุณเกี่ยวกับความซับซ้อนของทฤษฎี แต่ฉันสามารถให้สรุปหนึ่งประโยค การวัดในเซตXนั้นมีความสำคัญว่า "สิ่งที่จำเป็นในการทำให้ค่าเฉลี่ยทำงาน" กล่าวได้ว่าถ้าเรามีเซตXและหน่วยวัดμบนเซตนั้นก็มีคลาสของฟังก์ชันX →ℝเรียกว่าฟังก์ชันที่วัดได้ซึ่งนิพจน์X f dμนั้นสมเหตุสมผลและในบางแง่มุมที่คลุมเครือ ว่า "ค่าเฉลี่ย" ของมากกว่าX

เมื่อทำการวัดในชุดหนึ่งสามารถกำหนด "การวัด" สำหรับชุดย่อยของชุดนั้นได้ สิ่งนี้ทำได้โดยการกำหนดให้ส่วนย่อยของฟังก์ชั่นคุณสมบัติของมัน (สมมติว่านี่เป็นฟังก์ชั่นที่วัดได้) สิ่งนี้อาจเป็นอนันต์หรือไม่ได้นิยาม

มีมาตรการมากมาย แต่มีสองสิ่งที่สำคัญที่นี่ หนึ่งคือการวัดมาตรฐานในสายจริงℝ สำหรับมาตรการนี้แล้วฉdμสวยมากสิ่งที่คุณจะได้รับการสอนในโรงเรียน (เป็นแคลคูลัสยังสอนในโรงเรียน?): สรุปสี่เหลี่ยมเล็ก ๆ น้อย ๆ และใช้ความกว้างขนาดเล็กและขนาดเล็ก ในการวัดนี้การวัดช่วงเวลาคือความกว้าง การวัดจุดคือ 0

อีกวัดที่สำคัญซึ่งทำงานบนใด ๆชุดที่เรียกว่าวัดจุด มันถูกกำหนดไว้เพื่อให้อินทิกรัลของฟังก์ชันคือผลรวมของค่า:

X f dμ = ∑ x ∈X f (x)

การวัดนี้กำหนดให้กับแต่ละซิงเกิลตันกำหนดค่าการวัดที่ 1 ซึ่งหมายความว่าเซ็ตย่อยมีการวัดแน่นอนถ้าหากมันมีค่า จำกัด และฟังก์ชั่นน้อยมากที่มีอินทิกรัล จำกัด ถ้าฟังก์ชั่นมีอินทิกรัล จำกัด มันจะต้องไม่ใช่ศูนย์ในจำนวนคะแนนที่นับได้เท่านั้น ดังนั้นส่วนใหญ่ของฟังก์ชั่นที่คุณอาจรู้ว่าไม่มีอินทิกรัล จำกัด ภายใต้มาตรการนี้

และตอนนี้ฟังก์ชั่นเดลต้า ลองนิยามที่กว้างมาก ๆ เรามีพื้นที่ที่วัด(x, μ) (เพื่อให้เป็นชุดที่มีมาตรการเกี่ยวกับมัน) และองค์ประกอบX เรา "กำหนดว่า" ฟังก์ชั่นเดลต้า (ขึ้นอยู่กับ) จะเป็น "ฟังก์ชั่น" δ : X →ℝกับทรัพย์สินที่δ (x) = 0ถ้าx ≠และX δ dμ = 1

ความจริงที่สำคัญที่สุดเกี่ยวกับเรื่องนี้ที่จะได้รับการระงับการคือ: ฟังก์ชั่นเดลต้าไม่จำเป็นต้องเป็นฟังก์ชั่น มันไม่ได้ถูกกำหนดอย่างถูกต้อง: ฉันไม่ได้พูดว่าδ a (a)คืออะไร

สิ่งที่คุณทำ ณ จุดนี้ขึ้นอยู่กับว่าคุณเป็นใคร โลกที่นี่แบ่งเป็นสองประเภท หากคุณเป็นนักคณิตศาสตร์คุณพูดสิ่งต่อไปนี้:

ตกลงดังนั้นฟังก์ชันเดลต้าอาจไม่ถูกกำหนด ดู Let 's ที่คุณสมบัติสมมุติและดูว่าเราสามารถหาบ้านที่เหมาะสมสำหรับมันที่มันถูกกำหนดไว้ เราสามารถทำเช่นนั้นและเราจบลงด้วยการกระจาย ฟังก์ชั่นเหล่านี้ไม่ได้ (จำเป็น) ฟังก์ชั่น แต่เป็นสิ่งที่ทำหน้าที่เหมือนฟังก์ชั่นเล็กน้อยและบ่อยครั้งที่เราสามารถทำงานกับพวกเขาราวกับว่าพวกเขาฟังก์ชั่น; แต่มีบางสิ่งที่พวกเขาไม่มี (เช่น "ค่า") ดังนั้นเราจึงต้องระมัดระวัง

หากคุณไม่ใช่นักคณิตศาสตร์คุณพูดสิ่งต่อไปนี้:

ตกลงดังนั้นฟังก์ชันเดลต้าอาจไม่ได้รับการกำหนดอย่างถูกต้อง ใครบอกอย่างนั้น นักคณิตศาสตร์กลุ่มหนึ่ง ไม่สนใจพวกเขา! พวกเขารู้อะไร

ตอนนี้ฉันต้องโกรธผู้ชมของฉันต่อไป

เดลต้า Diracมักจะถูกนำไปเป็นฟังก์ชั่นเดลต้าของจุด (มัก 0) ในบรรทัดจริงกับตัวชี้วัดมาตรฐาน ดังนั้นผู้ที่บ่นในความคิดเห็นเกี่ยวกับฉันที่ไม่รู้ว่า delta ของฉันกำลังทำเช่นนั้นเพราะพวกเขาใช้คำจำกัดความนี้ สำหรับพวกเขาฉันขอโทษ: แม้ว่าฉันจะดิ้นออกจากที่โดยใช้การป้องกันของนักคณิตศาสตร์ (เป็นที่นิยมโดยHumpty Dumpty : เพียงแค่กำหนดทุกอย่างเพื่อให้ถูกต้อง) มันเป็นรูปแบบที่ไม่ดีที่จะใช้คำมาตรฐานที่หมายถึงสิ่งที่แตกต่าง

แต่มีเป็นฟังก์ชั่นเดลต้าซึ่งจะทำสิ่งที่ฉันต้องการจะทำและมันคือสิ่งที่ฉันต้องการที่นี่ ถ้าฉันวัดค่าจุดบนเซตXดังนั้นจะมีฟังก์ชั่นของแท้δ a : X →ℝซึ่งเป็นไปตามเกณฑ์ของฟังก์ชั่นเดลต้า นี่เป็นเพราะเรากำลังมองหาฟังก์ชั่นX →ℝซึ่งเป็นศูนย์ยกเว้นที่aและผลรวมของค่าทั้งหมดของมันคือ 1 ฟังก์ชั่นนั้นง่าย: ชิ้นข้อมูลที่ขาดหายไปเพียงอย่างเดียวคือค่าที่aและ เพื่อให้ได้ผลรวมที่จะเป็น 1 เราเพียงแค่กำหนดค่าที่ 1 นี้เป็นใครอื่นนอกจากฟังก์ชั่นในลักษณะ{a} แล้ว:

X δ a dμ = ∑ x ∈ X δ a (x) = δ a (a) = 1

ดังนั้นในกรณีนี้สำหรับชุดซิงเกิลฟังก์ชันคุณสมบัติและฟังก์ชันเดลต้าจึงเห็นด้วย

โดยสรุปมี "ฟังก์ชั่น" สามตระกูลที่นี่:

  1. ฟังก์ชั่นลักษณะของชุดซิงเกิล
  2. ฟังก์ชันเดลต้า
  3. ฟังก์ชัน Kronecker delta

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

ดังนั้นในที่สุดเมื่อฉันเดิมเขียนคำตอบที่ฉันไม่ได้คิดอย่างถูกต้อง (ฉันจะไม่ไปให้ไกลที่สุดเท่าที่จะบอกว่าผมกำลังสับสนเป็นฉันหวังว่าฉันได้แสดงให้เห็นเพียงแค่ผมไม่ทราบว่าสิ่งที่ผมพูดเกี่ยวกับเมื่อ ฉันคิดอย่างแรกจริงๆฉันไม่ได้คิดอะไรมาก) ความหมายทั่วไปของเดลต้า dirac ไม่ใช่สิ่งที่ต้องการในที่นี้ แต่หนึ่งในคำตอบของฉันคือว่าโดเมนอินพุทไม่ได้ถูกกำหนดไว้ดังนั้น Kronecker delta ก็จะไม่ถูกต้องเช่นกัน ดังนั้นที่ดีที่สุดทางคณิตศาสตร์คำตอบ (ซึ่งผมกำลังเล็งหา) จะได้รับลักษณะฟังก์ชั่น

ฉันหวังว่าทุกอย่างชัดเจน และฉันก็หวังว่าฉันจะไม่ต้องเขียนชิ้นส่วนทางคณิตศาสตร์อีกครั้งโดยใช้เอนทิตี HTML แทนที่จะเป็นมาโคร TeX!


37
+1 - ถ้าฉันสามารถลงคะแนน Quentin โดยไม่ทราบว่าฟังก์ชัน dirac_delta ฉันต้องการ ฉันอยากรู้ว่าวิทยาลัยแห่งไหนที่เขาไปเพราะฉันไม่คิดว่าฉันจะจ้างใครจากที่นั่นถ้าพวกเขาไม่รู้จักสิ่งที่เป็นพื้นฐานในการประมวลผลดิจิทัล ฉันจะดูถูกดูแคลนเคว็นตินต่อไปเพราะเขาไม่สามารถเข้าใจอารมณ์ขันที่คุณกำลังพยายาม
Dunk

23
ถ้าฉันลงคะแนนทุกคำตอบฉันไม่เข้าใจ ... ฉันจะลงคะแนนให้กับคำตอบมากมาย
เชมัส

4
สวัสดีแอนดรูว์มันผ่านมาซักพักแล้ว
Tim Down

4
@Tim: ความเศร้าโศกที่ดีดังนั้นจึงมี! และโคนของเบอร์มิวดาเป็นอย่างไร (ฉันจำได้ใช่มั้ย) ฉันคิดว่ากระทู้ความคิดเห็นนี้ไม่ใช่ที่ที่ดีที่สุดที่จะตามทันแม้ว่า ... 17 ปีใช่มั้ย
Andrew Stacey

3
@ Cԃաԃ "คำตอบนี้ได้ล้มเหลว ..." ถอนหายใจ คุณอ่านแล้วว่าฉันเป็นนักคณิตศาสตร์ใช่มั้ย คำตอบนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับโปรแกรมเมอร์ทรงกลมในสุญญากาศดังนั้นฉันไม่รู้ว่าคุณกำลังบ่นอะไร
Andrew Stacey

35

คุณสามารถทำได้

v = Math.abs(--v);

การลดลงตั้งค่าเป็น 0 หรือ -1 แล้วMath.absแปลง -1 เป็น +1


27
นี่กลายเป็นการแข่งขัน 'สร้าง 10000 วิธีในการทำงานง่ายๆ' และฉันชอบทุกวิธีฮ่าฮ่า
Josh

27
v = Math.round(Math.sin(Math.PI/(v+3)));
เบอนัวต์

15
@Benoit - สูตรของคุณมีค่าเท่ากับ 1 สำหรับทั้ง v = 0 และ v = 1 อันนี้ถูกต้องแล้ว! v = Math.round(Math.cos(Math.PI/((v*2+1)+2)-2*v));: D
Teo.sk

2
นั่นจะไม่เปลี่ยนค่า ถ้าเช่นv = 1นั้นv = Math.Abs(-1)คือ +1 หากv = 0แล้วv = Math.Abs(-0)ซึ่งเป็น 0.
พอล

1
+1 และนี่คืออีกอันหนึ่งของฉัน ...
เรียกซ้ำ

34

โดยทั่วไปเมื่อใดก็ตามที่คุณต้องการสลับระหว่างสองค่าคุณสามารถลบค่าปัจจุบันจากผลรวมของค่าสลับสองค่า:

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 

2
สิ่งนี้น่าสนใจและสร้างสรรค์ แต่อาจเป็นอันตรายได้ หากvเกิดความเสียหายก็จะเริ่มสลับระหว่างสองค่าที่แตกต่างกัน (สิ่งที่ต้องพิจารณา ... )
oosterwal

1
+1 สำหรับแนวคิดที่น่าสนใจ ไม่ใช่ว่า OP หรือใคร ๆ จะใช้มันในสถานการณ์เช่นนี้ แต่ข้อมูลชิ้นนี้ควรมีอยู่ในสมองตลอดไป
Shimmy Weitzhandler

3
@oosterwal: จากนั้นแน่นอนปัญหาอยู่กับความเสียหาย ...
GManNickG

@GManNickG: ไม่ช้าก็เร็วความเสียหายของข้อมูลจะเกิดขึ้นดังนั้นเราต้องระวังผลที่ตามมาของการไม่ตรวจจับ หากvโดยปกติจะใช้เพื่อรันสองสถานะจากรายการของสามสถานะขึ้นไปการคอร์รัปชั่นvอาจทำให้โปรแกรมรันสองสถานะที่ต่างกันโดยสิ้นเชิง - ซึ่งอาจส่งผลให้เกิดผลลัพธ์ที่ไม่คาดคิดและไม่พึงประสงค์ บทเรียนที่จะนำออกจากสิ่งนี้คือ: ทำการตรวจสอบความน่าเชื่อถือกับข้อมูลของคุณเสมอ
oosterwal

33

ถ้ามันต้องเป็นจำนวนเต็ม 1 หรือ 0 แสดงว่าคุณทำได้ดี แต่ไม่จำเป็นต้องใช้วงเล็บ หาก a เหล่านี้จะถูกใช้เป็นบูลีนคุณสามารถทำได้ดังนี้:

v = !v;

10
ผลลัพธ์นี้จะเป็นการตั้งค่า "v" ของ Ollie เป็นผลบูลีนไม่ใช่จำนวนเต็มหรือไม่
Brian

12
ใช่มันจะและฉันเตือนว่าในประโยคข้างต้นบรรทัดของรหัส หากสิ่งเหล่านี้จะถูกใช้เป็นบูลีน
Michael Berkowski

23
v = v == 0 ? 1 : 0;

ก็พอแล้ว!


7
มีความคิดเห็นมากกว่าคำตอบคุณไม่คิดอย่างนั้นเหรอ?
Brian

16
@Brian: 'ดีกว่า' เป็นเรื่องเกี่ยวกับความเห็นจริง ๆ
pimvdb

3
ฉันชอบวิธีที่คุณถอดวงเล็บออก - นั่นทำให้มีตัวละครออกมาสองสามตัว!
Ollie Glass

9
@ Brian: ว่า " คำตอบ " คือ"ไม่มีมีไม่ได้เป็นวิธีที่ดีกว่าของการเขียนv = (v==0 ? 1 : 0); " คนอื่น ๆ กำลังค้นหาวิธีการเล่นกอล์ฟที่แตกต่างกัน และไม่ตอบคำถามจริงๆ นั่นเป็นเหตุผลที่ฉันได้รับการโหวตคำตอบนี้
เอียนบอยด์ส

19

รายการโซลูชั่น

มีสามวิธีที่ฉันต้องการเสนอ ทั้งหมดของพวกเขาแปลงค่าใด ๆ ไป0(ถ้า1, trueฯลฯ ) หรือ1(ถ้า0, false, nullฯลฯ ):

  • v = 1*!v
  • v = +!v
  • v = ~~!v

และอีกหนึ่งที่กล่าวถึงแล้ว แต่ฉลาดและรวดเร็ว (แม้ว่าใช้ได้กับ0s และ1s เท่านั้น):

  • v = 1-v

โซลูชันที่ 1

คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้:

v = 1*!v

นี่เป็นครั้งแรกจะแปลงจำนวนเต็มเพื่อบูลตรงข้าม ( 0การTrueและค่าอื่น ๆ ให้False) 1แล้วจะรักษามันเป็นจำนวนเต็มเมื่อคูณด้วย ผลที่ตามมา0จะถูกแปลงเป็น1และความคุ้มค่าอื่น ๆ 0ให้

เป็นหลักฐานดู jsfiddle นี้และให้ค่าใด ๆ ที่คุณต้องการทดสอบ: jsfiddle.net/rH3g5/

ผลลัพธ์มีดังนี้:

  • -123จะแปลงเป็นจำนวนเต็ม0,
  • -10จะแปลงเป็นจำนวนเต็ม0,
  • -1จะแปลงเป็นจำนวนเต็ม0,
  • 0จะแปลงเป็นจำนวนเต็ม1,
  • 1จะแปลงเป็นจำนวนเต็ม0,
  • 2จะแปลงเป็นจำนวนเต็ม0,
  • 60จะแปลงเป็นจำนวนเต็ม0,

โซลูชันที่ 2

ตามที่ mblase75 ตั้งข้อสังเกตไว้ jAndy มีวิธีแก้ปัญหาอื่น ๆ ที่ทำงานเหมือนกับของฉัน:

v = +!v

นอกจากนี้ยังสร้างบูลีนจากค่าเดิม แต่ใช้+แทน1*การแปลงเป็นจำนวนเต็ม ผลลัพธ์จะเหมือนกันทุกประการ แต่สัญกรณ์จะสั้นกว่า

โซลูชันที่ 3

อีกวิธีคือการใช้~~โอเปอเรเตอร์:

v = ~~!v

มันค่อนข้างแปลกและแปลงเป็นจำนวนเต็มจากบูลีนเสมอ


ใน JavaScript คุณสามารถนำหน้าตัวแปรด้วย+เพื่อแปลงเป็นตัวเลขดังนั้นจึง+!vเทียบเท่ากับโซลูชันของคุณ (โซลูชัน jAndy ในความคิดเห็นของ OP)
Blazemonger

@ mblase75: ใช่คุณถูกที่1*สามารถถูกแทนที่ด้วย+เมื่อพยายามแปลงบูลีนเป็นจำนวนเต็ม ทุกอย่างในคำตอบของฉันยังคงเหมือนเดิม คำตอบของ jAndy นั้นถูกต้อง แต่ของฉันนั้นละเอียดมากกว่านี้ ฉันจะเพิ่มคำตอบของเขา / เธอในคำตอบของฉัน
Tadeck

@Tadeck +1 สำหรับแนวคิดที่ดี
Shimmy Weitzhandler

17

เพื่อสรุปคำตอบอื่นความคิดเห็นและความคิดเห็นของฉันฉันขอแนะนำให้รวมสองสิ่ง:

  1. ใช้ฟังก์ชั่นสำหรับสลับ
  2. ภายในฟังก์ชั่นนี้ใช้การใช้งานที่อ่านง่ายขึ้น

นี่คือฟังก์ชั่นที่คุณสามารถวางไว้ในห้องสมุดหรือห่อในปลั๊กอินสำหรับ Javascript Framework อื่น

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

และการใช้งานเป็นเพียง:

v = inv(v);

ข้อดีคือ:

  1. ไม่มีการทำสำเนารหัส
  2. หากคุณหรือใครอ่านอีกในอนาคตคุณจะเข้าใจรหัสของคุณในเวลาไม่นาน

ที่พวกเขา? ฉันวิ่งทดสอบอย่างรวดเร็ว: jsperf.com/function-vs-no-function/2และดูเหมือนว่าความแตกต่างนั้นไม่มาก
Martin Schlagnitweit

25
7.5ns กับ 8.8ns 1.3 นาโนวินาทีพิเศษนั้นจะฆ่าคุณจริงๆ
เอียนบอยด์

5
ตลอดเวลาที่ฉันช่วยชีวิตฉันพาครอบครัวไปเที่ยวดิสนีย์เวิลด์! :-)
Tom

1
ถูกต้องทั้งหมด คนที่เขียนคำว่า "ฉลาด" อาจไม่จำเป็นต้องดูแลโค้ดโปรแกรมเมอร์ "gems" คนอื่น ๆ อีกต่อไป
Avi

1
ทำไมไม่function toggle(i){ return i == 0 ? 1 : 0 }?
Billy Moon

13

ฉันไม่รู้ว่าทำไมคุณต้องการสร้างบูลีนของคุณเอง? ฉันชอบไวยากรณ์ที่ขี้ขลาด แต่ทำไมไม่เขียนโค้ดที่เข้าใจได้?

นี่ไม่ใช่สั้นที่สุด / เร็วที่สุด แต่ชัดเจนที่สุด (และอ่านได้สำหรับทุกคน) กำลังใช้สถานะ / อื่น ๆ ที่รู้จักกันดี:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

หากคุณต้องการชัดเจนคุณควรใช้บูลีนแทนตัวเลขสำหรับสิ่งนี้ มันเร็วพอสำหรับกรณีส่วนใหญ่ ด้วย booleans คุณสามารถใช้ไวยากรณ์นี้ซึ่งจะชนะโดยย่อ:

v = !v;

1
นี่จะเป็นคำตอบที่ฉันต้องการ; แต่ผู้ประกอบการที่ประกอบไปด้วย vs if-elseเป็นสงครามศักดิ์สิทธิ์ฉันไม่ต้องการจุดชนวน === 0ที่กล่าวว่าผมคิดว่าบรรทัดแรกที่ควรจะเป็น ด้วยการป้อนข้อมูลตัวอย่างของ7การแสดงผลที่ถูกต้องคือ แต่การส่งออกนี้จะ0 1
เอียนบอยด์

4
มีค่าที่จะแก้ไขอินพุทแบบเงียบ ๆ 7 แทนที่จะทิ้งข้อยกเว้นบางอย่าง? ฉันหมายถึงถ้ารหัสอื่น ๆ ได้รับมันมาใน 7 เมื่อมันคาดหวังว่า 0 หรือ 1 เท่านั้นก่อนที่รหัสของคุณจะแก้ไขค่า?
Chuck van der Linden

12

อีกรูปแบบของโซลูชันดั้งเดิมของคุณ:

v = Number(v == 0);

แก้ไข: ขอบคุณ TehShrike และ Guffa ที่ชี้ให้เห็นข้อผิดพลาดในโซลูชันดั้งเดิมของฉัน


4
ตัวดำเนินการ == ส่งคืนบูลีน (แทนจำนวนเต็ม) ภายใต้ระบบจำนวนมาก สิ่งนี้จะใช้ได้ก็ต่อเมื่อ v ถูกนิยามเป็นจำนวนเต็มและภาษานั้นเท่ห์ด้วยการเลือกอัตโนมัติจากบูลีนถึงจำนวนเต็ม
TehShrike

จริงแท้แน่นอน. ฉันตอบคำถามในบริบทของ javascript (วิธีติดแท็กคำถาม)
Kurt Kaylor

@Kurt Kaylor: Javascript เป็นหนึ่งในระบบที่ผู้ให้บริการ == ส่งกลับค่าบูลีนดังนั้นจึงไม่เหมือนกับโซลูชันดั้งเดิม
Guffa

@Guffa: ฉันใช้ประโยชน์จากความจริงที่ว่าจาวาสคริปต์เป็นภาษาที่พิมพ์อย่างอ่อนกับการแปลงประเภทโดยนัย (เช่น '0.00.00' == 0, 0 == "", เท็จ == "", เท็จ == 0, 1 == จริง ฯลฯ ) ฉันสามารถใช้ค่าบูลีนที่ส่งคืนในลักษณะเดียวกับที่ฉันสามารถใช้จำนวนเต็มของค่า 0 หรือ 1 ลองตัวอย่างเช่นในการประเมิน "2 + จริง" ในคอนโซลจาวาสคริปต์คุณจะได้รับ 3
Kurt Kaylor

1
@Kurt Kaylor: ใช้ได้เฉพาะในสถานการณ์ที่คุณบังคับให้มีการแปลงโดยนัย ลองยกตัวอย่าง'opacity:'+trueและคุณจะจบลงด้วยแทนopacity:true opacity:1
Guffa

11

ฉันจะทำให้ชัดเจนยิ่งขึ้น

อะไรvหมายถึง?

เช่นเมื่อ v เป็นบางสถานะ สร้างสถานะของวัตถุ ใน DDD วัตถุค่า

ใช้ตรรกะในวัตถุค่านี้ จากนั้นคุณสามารถเขียนโค้ดของคุณในลักษณะที่ใช้งานได้มากกว่าซึ่งอ่านได้ง่ายกว่า การเปลี่ยนสถานะสามารถทำได้โดยการสร้างสถานะใหม่ตามสถานะปัจจุบัน คำสั่ง if / logic ของคุณจะถูกห่อหุ้มในวัตถุของคุณซึ่งคุณสามารถ unittest ได้ valueObject นั้นไม่เปลี่ยนรูปเสมอดังนั้นจึงไม่มีตัวตน ดังนั้นสำหรับการเปลี่ยนแปลงมันเป็นคุณค่าที่คุณต้องสร้างขึ้นมาใหม่

ตัวอย่าง:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);

6
มากกว่าวิศวกรรม?
alejandro5042

6
+1 ที่ทำให้ฉันหัวเราะ
Denshi


10

สิ่งนี้หายไป:

v = [1, 0][v];

มันทำงานเหมือนโรบินกลมเช่นกัน:

v = [2, 0, 1][v]; // 0 2 1 0 ...
v = [1, 2, 0][v]; // 0 1 2 0 ...
v = [1, 2, 3, 4, 5, 0][v]; // 0 1 2 3 4 5 ...
v = [5, 0, 1, 2, 3, 4][v]; // 0 5 4 3 2 1 0 ...

หรือ

v = {0: 1, 1: 0}[v];

เสน่ห์ของการแก้ปัญหาที่ผ่านมามันทำงานได้กับค่าอื่น ๆ ทั้งหมดเช่นกัน

v = {777: 'seven', 'seven': 777}[v];

สำหรับกรณีพิเศษอย่างเช่นต้องการรับค่า (เปลี่ยน) และundefinedรูปแบบนี้อาจมีประโยชน์:

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...

9

เนื่องจากนี่คือ JavaScript เราสามารถใช้ unary +เพื่อแปลงเป็น int:

v = +!v;

สิ่งนี้จะNOTทำให้คุณค่าของv(ให้trueถ้าv == 0หรือfalseถ้าv == 1) จากนั้นเราแปลงค่าบูลีนที่ส่งคืนเป็นค่าจำนวนเต็มที่สอดคล้องกัน



7

อีกหนึ่ง: v=++v%2

(ใน C มันจะง่าย++v%=2)

PS ใช่ฉันรู้ว่ามันเป็นการมอบหมายสองครั้ง แต่นี่เป็นเพียงการเขียนดิบของวิธีการของ C (ซึ่งไม่ได้ผลเหมือนที่เป็นสาเหตุ


3
เวอร์ชั่น C ของคุณผิดกฎหมาย คุณไม่สามารถแก้ไขผลลัพธ์ของ++โอเปอเรเตอร์ (ไม่ใช่ lvalue) สำหรับv=++v%2คุณกำลังแก้ไขvสองครั้ง ฉันไม่ทราบว่ากำหนดไว้ใน JavaScript หรือไม่ แต่ก็ไม่จำเป็น v = (v+1) % 2.
Keith Thompson

อย่างน้อยค่ะ c++นั้นคือ - เนื่องจากตัวดำเนินการ pre-incrementation มีลำดับความสำคัญสูงกว่าและปรับเปลี่ยนตัวแปร 'แทนที่' ดังนั้นจึงสามารถใช้เป็น lvalue ได้ ผมคิดว่าการดำเนินการของ JS ++เป็นเช่นที่มันลาดเทจะถือว่าเป็น lvalue: / และ yeas นี้เป็นซ้ำซ้อน แต่ฉันก็พยายามที่จะแสดงเพียงวิธีอื่น - มีการโพสต์แล้วโซลูชั่นที่ดี :)
อดัม Jurczyk

3
+1 สามารถเขียนเป็น v = (v + 1)% 2
niktrs

7

หากคุณรับประกันว่าอินพุตของคุณเป็น 1 หรือ 0 คุณสามารถใช้:

v = 2+~v;

7

กำหนดอาร์เรย์ {1,0} ตั้งค่า v เป็น v [v] ดังนั้น v ที่มีค่าเป็น 0 จะกลายเป็น 1 และ vica ในทางกลับกัน


ทางออกของฉันถูกต้องถ้าคุณไม่ชอบเขียนว่าทำไม ความคิดเห็นของคุณไม่มีใครช่วย โซลูชันของฉันอ่านตัวแปรซึ่งต่างจากการตัดสินใจ สิ่งนี้ต้องใช้ CPU น้อย
เอส ..

5

อีกวิธีที่สร้างสรรค์ในการทำเช่นนี้โดยมีvค่าเท่ากับค่าใด ๆ จะส่งคืน0หรือเสมอ1

v = !!v^1;

3
สอง!!ผลอะไรในคณิตศาสตร์ตรรกะคุณสามารถใส่!!!!ในการมีและจะเหมือนกัน แต่ส่งผลให้การดำเนินงาน 4 unneed
อเล็กซ์ K

10
@Alex: !!จะส่งไปยังบูล !!(1) === trueและ!!(0) === false
nickf

1
@nickf: aha ดังนั้นฉันเดาว่าv = Boolean(v^1)จะเป็นข้อมูลเพิ่มเติมขอบคุณสำหรับการอธิบาย - ไม่ได้คิดเกี่ยวกับการหล่อ
Alex K

1
@Alex "คณิตศาสตร์เชิงตรรกะ" หรือไม่ นี่คือเหตุผลที่นักคณิตศาสตร์เป็นโปรแกรมเมอร์ที่ไม่ดี อย่าเข้าใจฉันผิด โปรแกรมเมอร์ที่ดีก็เข้าใจคณิตศาสตร์ได้ดี แต่นี่ไม่เกี่ยวอะไรกับคณิตศาสตร์เชิงตรรกะ มันเป็นภาษาที่สร้างขึ้นซึ่งอย่างน้อยนิพจน์ใน Javascript !จะได้แปลงเป็นบูลีน การเพิ่มอันอื่น!จะเป็นการลบล้างบูลีนนั้น การคัดเลือกนั้นอยู่ที่นี่และผลลัพธ์ก็เป็นผล ไม่จำเป็นสำหรับ -1
Yanick Rochon

1
ฉันไม่ใช่นักคณิตศาสตร์เลย คุณสามารถลองและดูเองjsperf.com/javascript-boolean-test
Alex K

4

หากค่าที่เป็นไปได้สำหรับ v เป็นเพียง 0 และ 1 ดังนั้นสำหรับจำนวนเต็ม x ใด ๆ นิพจน์: v = Math.pow ((Math.pow (x, v) - x), v); จะสลับค่า

ฉันรู้ว่านี่เป็นวิธีแก้ปัญหาที่น่าเกลียดและ OP ไม่ได้มองหาสิ่งนี้ ... แต่ฉันกำลังคิดหาวิธีแก้ปัญหาอื่นเมื่อฉันอยู่ในลู: P




1

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


1

อย่างที่เรารู้กันว่าในจาวาสคริปต์เท่านั้นที่การเปรียบเทียบแบบบูลจะให้ผลลัพธ์ที่คุณคาดหวัง

นั่นv = v == 0ก็เพียงพอแล้วสำหรับสิ่งนั้น

ด้านล่างเป็นรหัสสำหรับสิ่งนั้น:

var v = 0;
alert("if v  is 0 output: " + (v == 0));

setTimeout(function() {
  v = 1;
  alert("if v  is 1 Output: " + (v == 0));
}, 1000);

JSFiddle: https://jsfiddle.net/vikash2402/83zf2zz0/

หวังว่าสิ่งนี้จะช่วยคุณได้ :)


ผลงานที่สลับค่า แต่ค่าไม่ได้สลับระหว่าง 0 และ 1 แต่ระหว่างและtrue falseคุณสามารถใช้v == 0เพื่อกำหนดค่าของตัวแปรในเงื่อนไข แต่ถ้าคุณต้องการใช้ค่า 0 หรือ 1 คุณจะต้องใช้สิ่งที่ต้องการv == 0 ? 0 : 1หรือNumber(v)เพื่อให้ได้ (นอกจากนี้คุณสามารถใช้v = !v;เพื่อสลับระหว่างtrueและfalse.)
Guffa

ใช่เข้าใจแล้ว .. ขอบคุณ :)
Vikash Pandey

0

v = หมายเลข (! v)

มันจะพิมพ์ส่งค่า Inverted Boolean เป็น Number ซึ่งเป็นเอาต์พุตที่ต้องการ

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