| = (Ký hiệu đơn bằng nhau) và & = (ký hiệu đơn và bằng nhau) có nghĩa là gì


116

Trong các dòng dưới đây:

//Folder.Attributes = FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;
Folder.Attributes |= FileAttributes.Directory | FileAttributes.Hidden | FileAttributes.System | FileAttributes.ReadOnly;


Folder.Attributes |= ~FileAttributes.System;
Folder.Attributes &= ~FileAttributes.System;

|=(ống đơn bằng) và &=(single dấu và tương đương) có nghĩa là trong C #
Tôi muốn loại bỏ thuộc tính hệ thống với việc giữ những người khác ...

Câu trả lời:


149

Chúng là các toán tử gán ghép , dịch (rất lỏng lẻo)

x |= y;

thành

x = x | y;

và tương tự đối với &. Có một số chi tiết hơn trong một vài trường hợp liên quan đến việc ép kiểu ngầm và biến mục tiêu chỉ được đánh giá một lần, nhưng về cơ bản đó là ý chính của nó.

Xét về các toán tử không ghép, &là "AND" theo chiều dọc bit|là "OR" theo chiều bit .

CHỈNH SỬA: Trong trường hợp này bạn muốn Folder.Attributes &= ~FileAttributes.System. Để hiểu tại sao:

  • ~FileAttributes.Systemcó nghĩa là "tất cả các thuộc tính ngoại trừ System " ( ~là một bitwise-KHÔNG)
  • & có nghĩa là "kết quả là tất cả các thuộc tính xảy ra ở cả hai phía của toán hạng"

Vì vậy, về cơ bản nó hoạt động như một mặt nạ - chỉ giữ lại những thuộc tính xuất hiện trong ("mọi thứ ngoại trừ Hệ thống"). Nói chung:

  • |=sẽ chỉ thêm bit vào đích
  • &=sẽ chỉ xóa các bit khỏi mục tiêu

2
x = x | (y);là một cách tốt hơn để mô tả nó bởi vì x |= y + z;không giống nhưx = x | y + z;
IronMensan

cảm ơn vì câu trả lời / nhưng với mục đích của tôi (xóa thuộc tính hệ thống) tôi nên sử dụng cái nào (| = hoặc & =)?
SilverLight

1
@LostLord:Folder.Attributes &= ~FileAttributes.System;
George Duckett

33

a |= btương đương với a = a | bngoại trừ chỉ ađược đánh giá một lần
a &= btương đương với a = a & bngoại trừ chỉ ađược đánh giá một lần

Để loại bỏ bit Hệ thống mà không thay đổi các bit khác, hãy sử dụng

Folder.Attributes &= ~FileAttributes.System;

~là phủ định bit. Do đó, bạn sẽ đặt tất cả các bit thành 1 ngoại trừ bit Hệ thống. and-ing nó với mặt nạ sẽ đặt Hệ thống thành 0 và giữ nguyên tất cả các bit khác vì 0 & x = 01 & x = xcho bất kỳx


1
Nó có nghĩa là gì mà achỉ được đánh giá một lần? Tại sao nó sẽ được đánh giá nhiều lần hơn thế?
silkfire

@silkfire này được gọi là đánh giá ngắn mạch, xem en.wikipedia.org/wiki/Short-circuit_evaluation
Polluks

@Polluks Vì vậy, về cơ bản a |= bthực sự có nghĩa là a = a || b?
silkfire,

@silkfire Đúng nhưng không hoán đổi một ống và hai ống.
Polluks

3

Tôi muốn xóa thuộc tính hệ thống với việc giữ lại các thuộc tính khác ..

Bạn có thể làm như vậy:

Folder.Attributes ^= FileAttributes.System;

1
Tôi nghĩ bạn muốn sử dụng XOR thay vì AND cho việc này.
GameZelda

một chút bối rối / ~ có cần thiết hay không
SilverLight

@LostLord Hai phương pháp này tương tự như xa như tôi biết
Chris S

@ChrisS ^= bitsẽ đặt bit nếu nó chưa được đặt, &= ~bitkhông đặt nó.
Chronicle

bạn chắc chắn không muốn sử dụng xor. Điều đó sẽ đặt nó trở lại nếu nó đã biến mất.
John Lord
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.