Các ~
(số học) điều hành flips tất cả các bit , nó được gọi là toán tử Bitwise phủ định:
! ~ logical and bitwise negation
Vì vậy, ở những nơi bối cảnh là số học, nó thay đổi một số với tất cả các bit là số không thành tất cả các bit là số. A $(( ~0 ))
chuyển đổi tất cả các bit của biểu diễn số (thường là 64 bit ngày nay) thành tất cả các bit.
$ printf '%x\n' "$(( ~0 ))"
ffffffffffffffff
Một số có tất cả các số được hiểu là số âm (bit đầu tiên 1
) 1
, hoặc đơn giản -1
.
$ printf '%x\n' "-1"
ffffffffffffffff
$ echo "$(( ~0 ))"
-1
Điều tương tự cũng xảy ra với tất cả các số khác, ví dụ: $(( ~1 ))
lật tất cả các bit:
$ printf '%x\n' "$(( ~1 ))"
fffffffffffffffe
Hoặc, ở dạng nhị phân: 1111111111111111111111111111111111111111111111111111111111111110
Trong đó, được hiểu là một số trong đại diện của hai là:
$ echo "$(( ~1 ))"
-2
Nói chung, phương trình toán học của con người $(( ~n ))
là bằng$(( -n-1 ))
$ n=0 ; echo "$(( ~n )) $(( -n-1 ))"
-1 -1
$ n=1 ; echo "$(( ~n )) $(( -n-1 ))"
-2 -2
$ n=255 ; echo "$(( ~n )) $(( -n-1 ))"
-256 -256
Và (câu hỏi của bạn):
$ n=33 ; echo "$(( ~n )) $(( -n-1 ))"
-34 -34