Keep it simple!
This works for IPv4 only, but since IPv6 does only support CIDR like /64
in fe80::1ff:fe23:4567:890a/64
calculations like that are unnecessary there.
All you need for an IPv4 network mask:
int cidr = Convert.ToString(mask.Address, 2).Count( o => o == '1');
Explanation based on the given example:
IPAddress mask = new IPAddress(new byte[] { 255, 255, 255, 240 });
// maskBinAsString = 11110000111101001111111111111111
string maskBinAsString = Convert.ToString(mask.Address, 2);
// cidr = 28
int cidr = Convert.ToString(mask.Address, 2).Count( o=> o == '1');