2010-04-17 60 views
12

Tôi có đoạn code sau đây và tôi không thể hiểu được ý nghĩa của nó:Hoạt động "| =" có nghĩa là gì trong C++?

var1 |= var2>0 ? 1 : 2; 

Bất cứ ai có thể giúp tôi xin vui lòng!

+1

trong CS, nó được gọi là một "com chuyển nhượng bảng Anh ". –

+2

Bạn nên đọc ngôn ngữ. – starblue

+0

FYI, điều này cũng có thể thực hiện được trong Java, ví dụ: 'int var1, var2'. – polygenelubricants

Trả lời

21
if (var2 > 0) 
    var1 = var1 | 1; 
else 
    var1 = var1 | 2; 

Đó là Bitwise-hoặc.

12

Tất cả các nhà điều hành a op= b là lối tắt đến a = a op b.

Tuy nhiên, vì C++ cho phép opop= được ghi đè riêng biệt, bạn dựa vào từng người triển khai loại tùy chỉnh để nhất quán.

+1

Tôi cho rằng bất kỳ ai thực hiện nhiệm vụ khác trong '@' và '@ =': s –

+1

@Matthieu: C++ là (và, IMO, sẽ luôn là một ngôn ngữ cung cấp cho bạn nhiều sợi dây để treo mình. – Richard

+0

Tôi không biết ai thực hiện chúng để có hành vi khác nhau (ngoại trừ việc phân công hợp chất rõ ràng thay đổi toán hạng bên trái của nó). Nhưng việc triển khai thực hiện mà không có người khác thì khá phổ biến, ví dụ: iostreams chèn khai thác. –

2

Nhà điều hành | = nghĩa Chuyển nhượng bởi Bitwise OR

4

Như những người khác đã nói nó là viết tắt của v1 = v1 | v2; sử dụng khác bạn có thể gặp là với các phép toán luận.
Given:

bool b = /*some value*/ 

Thay vì nói:

if(a) 
    b = true; 

bạn có thể thấy:

b |= a; 
6

cond ? x : y lợi nhuận x if cond là đúng và y khác. Đọc Ternary Operator

a |= b là viết tắt cho a = a | b được gán a | b để a

a | bbitwise OR của ab. (ví dụ: 2 | 3 = 3 và 1 | 2 = 3)

+0

2 | 3 = 3, phải không? – Cowan

+0

@Cowan: cảm ơn và cập nhật. –

3

Như những người khác trước tôi đã đề cập, điều đó có nghĩa là bạn sẽ kết thúc với các bài tập theo bitwise HOẶC.

Bitwise HOẶC có thể được minh họa bằng cách sử dụng các mẫu bit bên tay trái và bên phải và đặt chúng ở trên cùng của mỗi phần.

Trong mỗi cột: 0 + 0 cho 0, 1 + 0 cho 1, 0 + 1 cho 1, 1 + 1 cho 1.
Trong ngữ cảnh của booleans: false OR false == false, true HOẶC false == true, false OR true == true, true OR true == true.

Dưới đây là một ví dụ về Bitwise OR và các bit mô hình kết quả: var1 (11) | = var2 (14) -> var1 (15)

 
    1011 (11) 
OR 1110 (14) 
= 1111 (15) 
4

Số nguyên có thể được biểu diễn ở dạng nhị phân, do đó mỗi chữ số (bit, chuyển đổi) là 1 (trên) hoặc 0 (off):

00000000 == 0 
00000001 == 1 
00000010 == 2 
00000011 == 3 
00000100 == 4 
00001000 == 8 
00010000 == 16 

Bitwise OR kết hợp hai số bằng cách "sáp nhập" hai bộ bit:

First number:  00110000 
Second number: 00000010 
Result:   00110010 

Nếu bit là 1 trong EITHER của số đầu vào, sau đó nó sẽ là 1 trong kết quả.

Hãy so sánh với bitwise AND, mà tìm "chồng chéo" của hai bộ bit:

First number:  00110100 
Second number: 10011110 
Result:   00010100 

Nếu một bit là 1 trong CẢ các số đầu vào, sau đó nó sẽ là 1 trong kết quả.

Nếu các con số trong các biến a, b, bạn có thể đặt các Bitwise OR/AND kết quả vào một biến c mới:

unsigned int c = a | b; // OR 

unsigned int c = a & b; // AND 

Thông thường kết quả cần được đặt vào một trong hai biến , tức là

unsigned int c = a | b; // OR 
c = a; // copy 

vì vậy, như một cách viết tắt, bạn có thể làm điều này trong một bước duy nhất:

a |= b; // merge b directly into a