(n & (n - 1)) == 0
является лучшим. Однако обратите внимание, что это неправильно возвратит true для n=0, поэтому если это будет возможно, Вы захотите проверить на него явно.
http://www.graphics.stanford.edu/~seander/bithacks.html имеет большое количество умных алгоритмов битового жонглирования, включая этого.
Лишь недавно в графах Core Plot было включено элементарное взаимодействие с пользователем. Чтобы включить прокрутку в любом направлении, вы можете установить для свойства allowedUserInteraction
пространства графика значение YES.
В настоящее время у нас нет средств для блокировки этого движения в одном направлении. Действие прокрутки происходит в методе -pointingDeviceDraggedAtPoint:
в CPXYPlotSpace, поэтому вы можете создать подкласс CPXYPlotSpace, скопировать его реализацию этого метода и изменить его, чтобы разрешить движение только в направлении X. Более того, мы были бы признательны за любой вклад в расширение функциональности CPXYPlotSpace для добавления поддержки однонаправленного движения.
Ограничьте прокрутку, установив делегат (например, CPPlotSpaceDelegate) в пространстве графика и реализуя метод willChangePlotRangeTo. Вы можете одновременно заниматься другими интересными делами. Вот как я ограничиваю отображение одним квадрантом:
- (CPPlotRange *)plotSpace:(CPPlotSpace *)space
willChangePlotRangeTo:(CPPlotRange *)newRange
forCoordinate:(CPCoordinate)coordinate {
// Display only Quadrant I: never let the location go negative.
//
if (newRange.locationDouble < 0.0F) {
newRange.location = CPDecimalFromFloat(0.0);
}
// Adjust axis to keep them in view at the left and bottom;
// adjust scale-labels to match the scroll.
//
CPXYAxisSet *axisSet = (CPXYAxisSet *)self.graph.axisSet;
if (coordinate == CPCoordinateX) {
axisSet.yAxis.orthogonalCoordinateDecimal = newRange.location;
axisSet.xAxis.titleLocation = CPDecimalFromFloat(newRange. newRange.locationDouble +
(newRange.lengthDouble / 2.0F));
} else {
axisSet.xAxis.orthogonalCoordinateDecimal = newRange.location;
axisSet.yAxis.titleLocation = CPDecimalFromFloat(newRange.locationDouble +
(newRange.lengthDouble / 2.0F));
}
return newRange;
}
См .: CPPlotSpace.h